簡體   English   中英

用q.js鏈接承諾

[英]chaining promises with q.js

我試圖了解承諾鏈是如何工作的。 我正在使用q.js. 這就是我正在玩的東西。

var Q = require("q"); // npm install q

// the function Q(value) returns a fulfilled promise with the value... I think.
Q(1).then(Q(2)).then(Q(3)).then(Q(4)).then(function(n) {
    console.log(n);
});

Q(1).then(function(n) {
    return Q(2);
}).then(function(n) {
    return Q(3);
}).then(function(n) {
    return Q(4);
}).then(function(n) {
    console.log("done: " + n);
});

我的問題基本上歸結為為什么第一個記錄1而后者記錄我期望的,基本上記錄1到4.我希望第一個記錄4而不是1

我真的只是希望能夠有一些返回promises的方法,然后像瀑布一樣將它們鏈接在一起 - 我想我可以使用異步和瀑布,但只是想知道這是否可以實現w / promises。

這是因為then並不期待另一個承諾作為論據。 相反,它預計處理函數 ,一個回調和/或errback可 ,你傳遞你的第二個例子是前者。 事實上,任何不是函數的論證都會被忽略

來自文檔

如果在處理程序中返回值,則將實現outputPromise。

如果在處理程序中拋出異常,則outputPromise將被拒絕。

如果在處理程序中返回一個promise,則outputPromise將“成為”該promise。 能夠成為新承諾對於管理延遲,組合結果或從錯誤中恢復非常有用。

所以是的,可以完成鏈接承諾。 你在第二個例子中正確地做到了。

通過實現承諾的設計示例可能會使鏈接承諾的工作方式顯得過於冗長,但在實際使用中,您通常會將承諾鏈接起來,因為您對其返回值感興趣,例如:

somethingAsync().then(function (n) {
  return somethingElseAsync(n);
})
.then(function (n) {
  return somethingElseAsync(n);
})
.then(function (result) {
  // ...
})

(實際上反映了async.waterfall 。如果你只是想按順序調用一系列異步函數而不考慮它們的結果,你可以使用async.series

我知道javascript沒有靜態類型,但你需要在這里考慮類型。

Q(1);                             // has type Promise[Int]
function (n) { return Q(2); }     // has type Int => Promise[Int]

Q.then需要第二個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM