如何从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; }
一定要把i
和urls
封闭。
也许我误解了你想做什么,但看起来你只需要简化你的parseUrls
函数,并使用Q.all
( docs )。 Q.all
为您传入的承诺数组返回一个新的承诺:
function parseUrls(urls) { return Q.all(urls.map(function (url) { return parseUrl(url); })); }