2017-08-17 8 views
1

私はアイテム1をPOSTしてからレスポンスを待ってからアイテム2をPOSTする必要があると言いますが、アイテムの数は分かりません。リクエストの数を知らずにJavascriptのAjaxリクエストをチェーンする方法。 (Nodejs)

for(item in array){ 
    request({ 
    uri: 'http://some.url/', 
    method: 'POST', 
    data: item 
    }, function(clbck){ 
    <request with data item2 and so on> 
    }) 
} 

など要求(n)が終了しない限り。

数量を知らずにリクエストをチェーンする方法はありますか?

+0

1つのオプション:約束。ここでヘルパーメソッドです:https://www.npmjs.com/package/promise-reduce – undefined

+0

しかし、それらをチェーンする方法は? @Ram – F1ks3r

+0

このブルーバードのドキュメントページにはいくつかの例があります:http://bluebirdjs.com/docs/api/promise.reduce.html還元機能は約束を返すべきであり、リクエストを順番に実行すべきでない場合は、 'Promise.each'ヘルパー。 – undefined

答えて

1

この問題の解決策は、驚異的な非同期/待機機能でした。しかし、私はコールバックでそれらを使用しました。私はそれを初期化する必要がありました。

// init a async function 
const post_message = async (id, array) => { 

    // init loop of requests 
    for(let iter = 0; iter<array.length; iter++){ 

     // lets wait for promise to resolve or reject (no need to return anything) 
     await new Promise(function(resolve,reject){ 
      request({ 
       uri: 'my_post_url', 
       method: 'POST', 
       json: {data: my_data} 
      },function(error,response,body){ 
       if(error) { 
        reject('REJECTED') 
       } else { 
        resolve('RESOLVED') 
       } 
      }) 
     }) 
    } 
} 

とpromiceの出来上がりたちができるチェーン(のawait)次々に行くの要求のために、ここで重要なのは待つことである(キャッチ、当時)の決意を探したり拒否し、待って、コールバックを気にしませんか返すかのtry/catch方法...コールバックで

+1

もう1つのオプションはasync.jsです。これは非同期作業のための多くのフロー制御オプションを提供します。 – Paul

+0

@Paulおかげさまで、私はすでにasync.jsとbluebird.jsも見ていました。 – F1ks3r

0

:約束(requestの約束を返すバージョンが必要)で

const makeRequest = (item, cb) => request({ 
    uri: 'http://some.url/', 
    method: 'POST', 
    data: item 
}, cb); 

// 1. reverse() so that we can start building the callback chain from the end 
// 2. Build up callback chain (starting with no-op function passed in as initial state 
// to reduce) by returning a function which calls makeRequest() with the current item 
// and passes the existing chain of callbacks to be called after that request finishes 

const callbackChain = array.reverse().reduce((chain, item) => { 
    return() => makeRequest(item, chain); 
},() => {}); 

callbackChain(); 


let promise = Promise.resolve(); 

// You can always attach more .then callbacks to an existing promise 
for (let item of array) { 
    promise = promise.then(() => request({ 
    uri: 'http://some.url/', 
    method: 'POST', 
    data: item 
    })); 
} 

またはArray#reduceと:

const promise = array.reduce((promise, item) => { 
    return promise.then(() => request({ 
    uri: 'http://some.url/', 
    method: 'POST', 
    data: item 
    })); 
}, Promise.resolve()); 
0

あなたも約束/非同期待つか、他のライブラリは必要ありません。

function do(item) { 
    request({ 
     uri: 'http://some.url/', 
     method: 'POST', 
     data: item 
    },() => { 
     let nextElement = array.shift(); 
     if (nextElement) { 
      do(nextElement); 
     } 
     else { 
      // all done 
     } 
    }); 
} 

do(array.shift()); 

それとも、それは少しクリーナーたい場合は、async.eachSeries良い解決策になるでしょう

関連する問題