簡體   English   中英

如何在承諾鏈中調用Q promise通知

[英]How to call Q promise notify within the promise chain

我需要在promise鏈中的notify()上提供幫助。

我有3個promise基本函數connect()send(cmd)disconnect() 現在我想編寫另一個函數來以下面的方式用進度通知來包裝這些調用。

function bombard() {
 return connect()
  .then(function () {
    var cmds = [/*many commands in string*/];
    var promises = _.map(cmds, function (cmd) {
     var deferred = Q.defer();
     deferred.notify(cmd);
     send(cmd).then(function (result) {
      deferred.resovle(result);
     });
     return deferred.promise;
    });
    return Q.all(promises);
  })
 .finally(function () { return disconnect() })
}

運行這樣的功能

bombard.then(onResolve, onReject, function (obj) {
 console.log(ob);
});

我想我會收到我發送的每個命令的通知。 但是,它沒有像我預期的那樣工作。 我什么都沒得到。

雖然我認為這是由於那些通知沒有傳播到外部承諾,我不知道如何在Q上傳播這些通知或包裝該承諾鏈: connectsenddisconnect一個延遲對象。

謝謝

我有一些好消息和一些壞消息。

很好! 您已經發現了通知API的問題以及它在v2分支中被刪除的原因,在Bluebird這樣的新庫中被棄用,並且從未包含在ECMAScript 6中。它實際上歸結為promises不是事件發射器。

通知API不會很好地組合或聚合。 事實上,承諾的通知開始時並沒有太多意義。

相反,我建議使用進度通知,有點像C#中的IProgress。 我將使用Q.delay()模擬所有操作以進行隔離,您的代碼顯然會進行真正的調用

function connect(iProgress){
    return Q.delay(1000).then(function(res){
        iProgress(0.5,"Connecting to Database");
    }).delay(1000).then(function(res){
        iProgress(0.5,"Done Connecting");
    });

} 

function send(data,iProgress){
     return Q.delay(200*Math.random() + 200).then(function(res){
         iProgress(0.33, "Sent First Element");
     }).delay(200*Math.random() + 400).then(function(){
         iProgress(0.33, "Sent second Element");
     }).delay(200*Math.random() + 500).then(function(){
         iProgress(0.33, "Done sending!");
     });
}
// disconnect is similar

現在,我們可以輕松決定我們的承諾如何構成,例如:

function aggregateProgress(num){
     var total = 0;
     return function(progression,message){
          total += progression;
          console.log("Progressed ", ((total/num)*100).toFixed(2)+"%" );
          console.log("Got message",message);
     }
}

哪個會讓你這樣做:

// bombard can accept iProgress itself if it needs to propagate it
function bombard() {
 var notify = aggregateProgress(cmds.length+1);
 return connect(notify)
  .then(function () {
    var cmds = [/*many commands in string*/];
    return Q.all(cmds.map(function(command){ return send(command,notify); }));
  });
}

這是一個完整而有效的小提琴

暫無
暫無

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

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