2017-08-01 117 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)。