如何解析 Q.when() 中的一组分辨率?
How to resolve an array of resolutions from Q.when()?
我对 promises 还很陌生,在思考 Q.when()
链时遇到了问题。
我要按顺序履行我的承诺。
这就是我目前所知道的。它是 运行 顺序的,但它没有解析我的 URL。 parseUrls(urls)
应该 return 所有 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);
也许我误解了你想做什么,但看起来你只需要稍微简化你的 parseUrls
函数并使用 Q.all
(docs)。 Q.all
returns 从您传入的承诺数组中收集的结果的新承诺:
function parseUrls(urls) {
return Q.all(urls.map(function (url) {
return parseUrl(url);
}));
}
对于顺序执行,链你的承诺与$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
放在闭包中。
我对 promises 还很陌生,在思考 Q.when()
链时遇到了问题。
我要按顺序履行我的承诺。
这就是我目前所知道的。它是 运行 顺序的,但它没有解析我的 URL。 parseUrls(urls)
应该 return 所有 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);
也许我误解了你想做什么,但看起来你只需要稍微简化你的 parseUrls
函数并使用 Q.all
(docs)。 Q.all
returns 从您传入的承诺数组中收集的结果的新承诺:
function parseUrls(urls) {
return Q.all(urls.map(function (url) {
return parseUrl(url);
}));
}
对于顺序执行,链你的承诺与$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
放在闭包中。