如何从Q.when()中解析一组分辨率



我对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;
}

确保将iurls放在一个闭包内。

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

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

相关内容

  • 没有找到相关文章

最新更新