Sự khác biệt giữa async.waterfall và async.series là gì


Câu trả lời:


168

Nó dường như async.waterfallcho phép mỗi hàm chuyển kết quả của nó cho hàm tiếp theo, trong khi async.serieschuyển tất cả kết quả cho lần gọi lại cuối cùng. Ở cấp độ cao hơn, async.waterfallsẽ dành cho một đường ống dữ liệu ("cho 2, nhân với 3, cộng 2 và chia cho 17"), trong khi async.seriessẽ dành cho các tác vụ rời rạc phải được thực hiện theo thứ tự, nhưng nếu không thì tách biệt.


Có thể cho một trong hai hàm này trả về giá trị không? Tôi đã đọc rằng điều đó có thể xảy ra, nhưng tôi không thể tìm thấy thông tin liên quan ở bất kỳ đâu trong tài liệu.
Anderson Green

1
@AndersonGreen: Không. Nhìn vào các nguồn thư viện, không phải waterfallvà cũng không seriestrả về một giá trị. Dự kiến ​​rằng bất kỳ kết quả nào sẽ được sử dụng trong tham số gọi lại tùy chọn.
Twisol

Câu trả lời ở trên có thể đúng về năm 2012, nhưng câu trả lời đúng giống với câu tiếp theo, đó là: series () vì nó được đặt tên là TẤT CẢ kết quả là một chuỗi được chuyển đến lệnh gọi lại Cuối cùng và thác nước là kết quả CUỐI CÙNG được chuyển đến cuộc gọi lại cuối cùng. Xem nhà phát triển Mozilla
Jeb50, 14/09/17

53

Cả hai hàm đều truyền giá trị trả về của mọi hàm cho hàm tiếp theo, sau đó khi hoàn thành sẽ gọi lệnh gọi lại chính, chuyển lỗi của nó, nếu có lỗi xảy ra.

Sự khác biệt là async.series(), khi chuỗi kết thúc, sẽ chuyển tất cả các kết quả đến lệnh gọi lại chính. async.waterfall()sẽ chuyển đến lệnh gọi lại chính chỉ kết quả của hàm cuối cùng được gọi.


1
Đây hẳn là câu trả lời ;-)
Stuart Allen

@Mario "Cả hai hàm đều truyền lệnh gọi lại của hàm trước đó" HOẶC "Cả hai hàm đều truyền kết quả của hàm trước"?
user1451111

@ user1451111, Kết quả, lol ... Tôi chắc rằng tôi đã viết rằng lần đầu tiên mặc dù ...

26

async.waterfall()đang đối phó với một action that relies on the previous outcome.

async.series() đang đối phó với một hành động muốn see all the result at the end


1
Hình ảnh được tạo ra một cách tuyệt vời. Bạn đã tự tạo chúng hay lấy chúng ở một nơi khác?
user1451111 14/04/17

bạn nên đưa những bức ảnh vào câu trả lời, mọi người có thể sẽ nhớ chúng o / w
Alexander Mills

1

Tôi coi async.waterfall là có hại, vì rất khó để cấu trúc lại sau khi được viết và cũng dễ xảy ra lỗi vì nếu bạn cung cấp nhiều đối số hơn, các hàm khác sẽ thay đổi nhiều chữ ký.

Tôi thực sự khuyên bạn nên sử async.autoInjectdụng async.waterfall như một giải pháp thay thế tuyệt vời. https://caolan.github.io/async/autoInject.js.html

Nếu bạn chọn sử dụng async.waterfall, tôi khuyên bạn nên lưu trữ mọi thứ trong một đối tượng, để các hàm của bạn không phải thay đổi độ dài / chữ ký, như sau:

cảnh báo: đây là một mô hình xấu

async.waterfall([
  cb => {
    cb(null, "one", "two");
  },
  (one, two, cb) => {
    cb(null, 1, 2, 3, 4);
  },
  (one,two,three,four,cb) => {
     // ...
  }
])

không làm theo cách trên. Đây là một mẫu tốt hơn nhiều để sử dụng:

async.waterfall([
  cb => {
    cb(null, {one:"one", two:"two"});
  },
  (v, cb) => {
    cb(null, [1, 2, 3, 4]);
  },
  (v,cb) => {
     // ...
  }
])

bằng cách đó, bạn sẽ không kéo tóc ra khi cố gắng đảm bảo rằng các đối số của hàm có độ dài phù hợp. Hàm đầu tiên chỉ chấp nhận một đối số - gọi lại. Tất cả những cái còn lại nên chấp nhận hai đối số - một giá trị và gọi lại. Hãy bám sát mô hình và bạn sẽ vẫn khỏe mạnh!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.