簡體   English   中英

在承諾鏈中容納Q.all

[英]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]

所以,我的查詢是

  1. 如何通過使用Q.all來達到預期的輸出。 我確實有一種解決方法,但是看起來不太好。
  2. ff2有何不同,因為通過對它們運行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.

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