2013-10-09 71 views
2

我需要在循環內執行一個異步函數(使用不同的參數)。任何想法如何在Node.js中使用Q模塊來完成。 下面是一個例子: -如何使用Q.js在循環中執行異步函數

function addAsync(a, b) { 
    var deferred = q.defer(); 
    // Wait 2 seconds and then add a + b 
    setTimeout(function() { 
     deferred.resolve(a + b); 
    }, 2000); 
    return deferred.promise; 
} 

Q.all可以使用(),但是運行所有並聯。由於項目需求,我基本上需要依次執行它們。

回答

4

如果你不需要堅持Q.js,我建議你看看async

Async是一個流行的異步流程控制庫,它提供了大量有用的功能,包括serieswaterfall等功能,完全符合您的需求。謝謝:)

1

你有很多選擇,但是這應該讓你感動:

parameters.reduce(function (results, parameters) { 
    return results.then(function() { 
     return addAsync(parameters[0], parameters[1]) 
     .then(function (result) { 
      results.push(result); 
      return results; 
     }) 
    }); 
}, Q([])) 
.then(function (results) { 
    // ... 
}) 
.done() 

我有一個更愉快的解決方案,在未來的Q-IO https://github.com/kriskowal/q-io/pull/57

Reader(parameters) 
.map(function (parameters) { 
    return addAsync(parameters[0], parameters[1]) 
}, null, 1) 
.all() 
.then(function (results) { 
    // ... 
}) 

哪裏1是一個並行限制器。