如何在then() - chain中使用promise.all

时间:2016-02-02 22:39:24

标签: javascript node.js es6-promise

可能是我的问题标题已关闭,以防promise.all不是解决此问题的必要条件。

我的承诺中有一个then()链,我有一系列类似的操作,我真的应该采取不同的处理方式,但我是新的承诺。

return new Promise(function(resolve, reject) {

    c.scraper.load().then(function () {

    ....

        var personUrl = url + "/" + c.people[0];
        return c.checkPerson(personUrl);

    }).then(function(){

        var personUrl = url + "/" + c.people[1];
        return c.checkPerson(personUrl);

    }).then(function(){

        var personUrl = url + "/" + c.people[2];
        return c.checkPerson(personUrl);

    ....

我认为你遇到了问题。

第一步是将这三者合并为一,如果可能的话,第二步是使其与数组c.people中未知数量的人一起使用。

2 个答案:

答案 0 :(得分:2)

假设c.checkPerson返回Promise,您可以执行以下操作:

var promiseArray = c.people.map(function(person) {
  var personUrl = url + "/" + person;
  return c.checkPerson(personUrl)
})

Promise.all(promiseArray).then(function() {
  // complete
})

答案 1 :(得分:2)

首先,由于c.scraper.load()本身会返回一个承诺,您可以返回整个承诺链的结果,而不需要将其包装在new Promise(...)中。

接下来,由于c.people似乎是您要获取的路径数组,您可以map将数组添加到承诺列表中,然后使用Promise.all()等待它们全部解决:

return c.scraper.load().then(function () {
    return Promise.all(c.people.map(function (person) {
        var personUrl = url + "/" + person;
        return c.checkPerson(personUrl);
    }));
}).then(function (results) {
    // `results` is an array containing the results of the `checkPerson()` calls
});

这有帮助吗?