Mô-đun không đồng bộ nodejs: https://github.com/caolan/async cung cấp 2 phương pháp tương tự async.waterfallvà async.series.
sự khác biệt giữa chúng là gì?
Mô-đun không đồng bộ nodejs: https://github.com/caolan/async cung cấp 2 phương pháp tương tự async.waterfallvà async.series.
sự khác biệt giữa chúng là gì?
Câu trả lời:
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.
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.
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.
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
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!