我对promise相当陌生,在理解Q.when()
链时遇到了问题。
我想按顺序履行我的承诺。
这就是我目前所掌握的。它按顺序运行,但没有解析我的URL。CCD_ 2应返回所有CCD_ 3分辨率的数组。
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);
}));
}