2014-02-19 249 views
2

假設下面的例子:加入承諾,承諾的陣列中的for循環

var bb = require('bluebird'); 

var promiseStack = []; 
var deferred = bb.defer(); 

promiseStack.push(deferred.promise); 

bb.delay(2500).then(function() { 
    deferred.resolve(); 
}); 

bb.all(promiseStack).then(function() { 
    console.log('done'); 
}); 

爲什麼不能夠做到以下幾點:

var bb = require('bluebird'); 

var promiseStack = []; 


for(var i = 1; i < 10; i++) { 
    var deferred = bb.defer(); 
    promiseStack.push(deferred.promise); 

    bb.delay(2500).then(function() { 
     deferred.resolve(); 
    }); 
} 

bb.all(promiseStack).then(function() { 
    console.log('done'); 
}); 

這需要aprox的。 2500ms但不調用console.log('done')。 有什麼問題,我做錯了嗎?

最好的, redshark1802

回答

11

有什麼用,我究竟做錯了什麼問題?

您的deferred變量對於循環體而言不是本地的,而是在全局範圍內。每次用新的Deferred覆蓋它,只解析最後一個(但多次)。

要解決這個問題,你可以試試closure,但你shouldn't use Deferred anyway。只要使用你已有的承諾!

var bb = require('bluebird'); 

var promiseStack = []; 

for(var i = 1; i < 10; i++) // 1 to 9 ??? 
    promiseStack.push(bb.delay(2500)); 

bb.all(promiseStack).then(function() { 
    console.log('done'); 
});