如何从Q.when()parsing一系列分辨率?

我对诺言相当Q.when() ,并且在Q.when()链中出现了问题。

我想顺序执行我的承诺。

这是我到目前为止。 它正在顺序运行,但它不能解决我的url。 parseUrls(urls)应该返回一个包含所有parseUrl(url)分辨率的数组。

 function parseUrl(url) { return function () { var deferred = Q.defer(); // setTimeout as async placeholder setTimeout(function() { var result = {url: url}; deferred.resolve(result); } return deferred.promise; } } function parseUrls(urls) { var deferred = Q.defer(); var chain = Q.when(); urls.forEach(function (url) { chain = chain.then(parseUrl(url)); }); chain = chain.then(deferred.resolve); return deferred.promise; } getAllUrls() .then(parseUrls) .then(parseCards); 

对于顺序执行,请使用$q.all 链接您的承诺

 function parseUrls(urls) { var chain = $q.when([]); for (var i=0; i<urls.length; i++) { (function (i, urls) { chain = chain.then ( function (result) { result.push(parseUrl(urls[i])); return $q.all(result); }); })(i, urls); }; return chain; } 

一定要把iurls封闭。

也许我误解了你想做什么,但看起来你只需要简化你的parseUrls函数,并使用Q.all ( docs )。 Q.all为您传入的承诺数组返回一个新的承诺:

 function parseUrls(urls) { return Q.all(urls.map(function (url) { return parseUrl(url); })); }