NodeJS /请求承诺:承诺自动解决

时间:2017-08-01 18:50:34

标签: node.js promise request request-promise

我使用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(...);
}

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

问题是,即使我删除了Promise.all

,这些承诺也会被解雇

怎么可能?我怎么能许诺不解雇?

问候。

2 个答案:

答案 0 :(得分: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);

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

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);
    })

答案 1 :(得分:1)

你可以做他在编辑中建议的零点。

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

比较

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

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

第二个你调用将返回promise的函数,它将开始执行它。这就是问题所在,因为你太快就调用了rp(选项)。