1

我使用request-promise 节点模块如下:

let rp = require('request-promise');

我有以下承诺链:

getData().then( data => {
  return getUser(data);
})
.then( data => {
  return getProfiles(data);
}).then( data => {
  updateAddresses(data);
});

updateAddresses如下:

function updateAddresses(data){
   var promises = data.map( (aProfile) => {
      var options = {url:'http://example.com', method:'POST'};
      return rp(options);
   });

   // Promise.all(promises).then(...);
}

所以我正在为数组的每个元素准备一个承诺(request-promise)。

问题是即使我删除这些承诺也会触发Promise.all

这怎么可能?我怎样才能做出不触发的承诺?

问候。

4

2 回答 2

1

您可以执行 zero298 在他的编辑中建议的操作。

主要问题是您将数据映射到实际的承诺,而不是准备执行承诺的东西,

相比

Let promises = Options.map(option => execute(option))
Promise.all(promises)

Let promiseGenerators =Options.map(option => () => execute(option))
Promise.all(promiseGenerators.map(generator => generator())

第二次调用将返回承诺的函数,它将开始执行此操作。这就是问题所在,因为您调用 rp(options) 太快了。

于 2017-08-01T20:16:25.583 回答
1

updateAddresses没有返回任何可以调用then()的东西,你也没有等待会发生什么updateAddress

function updateAddresses(data){
   var promises = data.map( (aProfile) => {
      var options = {url:'http://example.com', method:'POST'};
      return rp(options);
   });

   //Return something to then()
   return Promise.all(promises).then(...);
}

然后等待它:

getData().then( data => {
  return getUser(data);
})
.then( data => {
  return getProfiles(data);
}).then( data => {
  return updateAddresses(data);
}).then(e => somethingelse);

根据您存储mapped 地址对象的要求:

function updateAddresses(data) {
    return data.map((aProfile) => {
        return {
            url: 'http://example.com',
            method: 'POST'
        }
    });
}

getData()
    .then(data => getUser(data))
    .then(data => getProfiles(data))
    .then((data) => {
        let addressOptions = updateAddresses(data);
        /*
         * You now have an Array of Objects of the form:
         * {
         *     url: "",
         *     method: "",
         * }
         */
        return Promise.resolve(addressOptions);
    })
    .then(addressOptions => Promise.all(addressOptions.map(address => rp(address))))
    .then((arrayOfResolvedData) => {
        /*
         * arrayOfResolvedData is an Array of data per whatever rp() returns
         * probably Response Objects
         */
        console.log(arrayOfResolvedData);
    })
于 2017-08-01T18:58:25.780 回答