2015-10-20 31 views
0

通知Q承諾的進展我想用QPromise進步的功能,我有這樣的代碼,我想趕上進度,當進度爲100,則解決Promise在Node.js的

var q = require("q"); 

var a = function(){ 
    return q.Promise(function(resolve, reject, notify){ 
     var percentage = 0; 
     var interval = setInterval(function() { 
      percentage += 20; 
      notify(percentage); 
      if (percentage === 100) { 
       resolve("a"); 
       clearInterval(interval); 
      } 
     }, 500); 
    }); 
}; 

var master = a(); 

master.then(function(res) { 
    console.log(res); 
}) 

.then(function(progress){ 
    console.log(progress); 
}); 

但我得到這個錯誤:

Error: Estimate values should be a number of miliseconds in the future 

爲什麼?

回答

0

如果我嘗試運行腳本(節點4.2.1),但沒有聽到承諾的進度,我不會收到此錯誤。 您需要註冊progressHandler作爲第三個參數.then功能:

var q = require("q"); 

var a = function(){ 
    return q.Promise(function(resolve, reject, notify){ 
     var percentage = 0; 
     var interval = setInterval(function() { 
      percentage += 20;     
      notify(percentage); 
      if (percentage === 100) { 
       resolve("a"); 
       clearInterval(interval); 
      } 
     }, 500); 
    }); 
}; 

function errorHandler(err) { 
    console.log('Error Handler:', err); 
} 

var master = a(); 

master.then(function(res) { 
    console.log(res); 
}, 
errorHandler, 
function(progress){ 
    console.log(progress); 
}); 

輸出:

20 
40 
60 
80 
100 
a 

必須進度回調作爲第三個參數註冊到.then -function或者您可以使用特殊.progress()速記,請參閱https://github.com/kriskowal/q#progress-notification

這裏是與progress速記的呼叫鏈:

var master = a(); 
master.progress(function(progress{ 
    console.log(progress)}) 
.then(function(res) { 
    console.log(res); 
}); 

在你的代碼,執行console.log(進度)打印undefined,因爲該功能是聽以前.then語句來,它不返回任何結果。

+0

如果我使用多個承諾一個錯誤處理程序,這應該工作?現在你說如果一個特定的承諾拋出錯誤,錯誤處理函數觸發 – Fcoder

+0

我更新了我的答案,以進一步澄清這一點。 – PatrickD

+0

似乎已取消進展:https://github.com/kriskowal/q/wiki/API-Reference#promiseprogressonprogress – Fcoder