2017-08-01 178 views
0

我使用request-promise节点模块如下:的NodeJS /请求承诺:承诺被自动解析

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

所以我准备承诺(请求承诺)为ea ch数组的元素。

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

这怎么可能?我怎样才能使诺言不被解雇?

问候。

+0

在updateAddresses中返回'Promise.all()'。 – zero298

+0

我不确定我是否解释了这个问题:在使用'Promise.all'之前,我想检查代码。我注意到承诺正在得到解决。我只是想将它们存储在promise数组中。 – Dae

+0

然后储存选项,不要在它们上面调用'rp'直到你准备好。您仍然需要从'updateAddresses'返回一些内容,否则当范围结束时'map()'将会丢失。 – zero298

回答

0

您的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); 
    }) 
+0

请看这个问题的评论:在我运行Promise.all代码之前,请求被解雇了。 – Dae

+0

@Dae看到我的编辑 – zero298

0

你能做些什么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)。