[英]Accommodating a Q.all in a promise chain
我對Q的簡單性起誓,因此我可能沒有做太多研究來研究其他“ then”實現。 但是我已經大量使用了Q!
我有一連串的“那么”的諾言,我想在其中解決“諾”的諾言,並按順序進行其他操作。 所以很明顯我應該使用Q.all。 但是我被困在這里。 Q做錯了,還是我做錯了。
這是兩個假設的異步操作
var f=function(delay){
return Q.delay(delay).then(function(){
console.log("returning delayed",delay)
return delay
})
}
f2=function(delay){
var defer=Q.defer()
setTimeout(function(){
console.log("returning timedout",delay)
return delay
},delay)
return defer.promise
}
這就是承諾鏈
Q('begin')
.then(console.log)
.then(Q.all([100,200,300,400].map(f)))
.then(function(){
console.log("Finally",arguments)
}).done()
這是我希望的輸出
begin
returning delayed 100
returning delayed 200
returning delayed 300
returning delayed 400
Finally { '0': undefined }
但這是我得到的輸出
begin
Finally { '0': undefined }
returning delayed 100
returning delayed 200
returning delayed 300
returning delayed 400
我得到與f2
相同的序列
現在,如果我運行此
Q.all([100,200,300,400].map(f)).then(function(){
console.log("Finally",arguments)
}).done()
我知道了
returning delayed 100
returning delayed 200
returning delayed 300
returning delayed 400
Finally { '0': [ 100, 200, 300, 400 ] }
但是用f2
代替f
給了我
returning timedout 100
returning timedout 200
returning timedout 300
returning timedout 400
它不執行finally
塊。
我得到與Q相同的輸出。[all / allResolved / allSettled]
所以,我的查詢是
f
和f2
有何不同,因為通過對它們運行Q.all()。then()的結果不同。 Q.all
接受一個Q.all
數組,但隨后返回一個promise(這是數組中每個promise解析后唯一解決的問題。
所以,我認為你需要返回的結果Q.all
為了不立即打電話下一then
:
Q('begin')
.then(console.log)
.then(function() {
return Q.all([100,200,300,400].map(f));
})
.then(function(){
console.log("Finally",arguments)
}).done()
回答第二個問題,您對f2
的使用不正確。
當您使用延期創建承諾時,必須解決該承諾才能兌現。 您可以在如何將回調API轉換為promises中了解更多信息。
在您的情況下,您將創建一個空的遞延並返回其諾言,但您從未真正對遞延調用.resolve
。 “更正確地”執行此操作將類似於:
f2=function(delay){
var defer=Q.defer()
setTimeout(function(){
console.log("returning timedout",delay)
defer.resolve(delay); // note the resolve here vs the return
},delay)
return defer.promise
}
使用Q.delay
效果更好,因為它已經實現了。 至於其他then
性實現Q被幾乎流血的邊緣,現在至少可以說:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.