Mô-đun không đồng bộ nodejs: https://github.com/caolan/async cung cấp 2 phương pháp tương tự async.waterfall
và 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.waterfall
và async.series
.
sự khác biệt giữa chúng là gì?
Câu trả lời:
Nó dường như async.waterfall
cho phép mỗi hàm chuyển kết quả của nó cho hàm tiếp theo, trong khi async.series
chuyển tất cả kết quả cho lần gọi lại cuối cùng. Ở cấp độ cao hơn, async.waterfall
sẽ 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.series
sẽ 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.
waterfall
và cũng không series
trả 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.autoInject
dụ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!