如何解析 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;
}

务必将 iurls 放在闭包中。