【问题标题】:How to resolve an array of resolutions from Q.when()?如何从 Q.when() 解析一系列分辨率?
【发布时间】:2015-11-22 20:10:03
【问题描述】:

我对 Promise 还很陌生,并且在处理 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);

【问题讨论】:

标签: javascript node.js promise q


【解决方案1】:

对于顺序执行,你的承诺$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 放入闭包内。

【讨论】:

  • 这很快。 3分钟内接受。谢谢。
【解决方案2】:

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

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

【讨论】:

  • map 不会导致顺序执行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2015-02-03
  • 2018-01-22
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多