2017-08-01 19 views
0

私は、次のようrequest-promiseノードモジュールを使用して解決されます。NodeJS /リクエストの約束:約束は自動的

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

updateAddressesは以下の通りである:

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

私は、次の約束のチェーンを持っています

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'を使う前に、コードをそのままチェックしたいと思っていました。そして、私は約束が解決されていることに気付きました。私は約束事の配列にそれらを保存したいだけです。 – Dae

+0

それからオプションを保存し、準備が整うまでそれらに 'rp'を呼んではいけません。 'updateAddresses'から何かを返す必要があります。それ以外の場合、' map() 'はスコープが終了すると失われます。 – zero298

答えて

0

updateAddressesthen()を呼び出すために何も返さず、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 promiseGenerators =Options.map(option =>() => execute(option)) 
Promise.all(promiseGenerators.map(generator => generator()) 

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

を比較していますあなたが約束を返す関数を呼び出すと、それが実行されます。それはあなたがrp(オプション)をあまりにも早く呼び出したので、問題がどこにあったのですか。