2017-09-16 9 views
-1

JavaScript, React - sending multiple simultaneous ajax calls約束と闘う。基本的には、1つのサーバコールが完了してから次のコールを行うだけで、コールをチェーンし、makeServerCalls内で作成されたエンドポイント/ pqrからのコールの正常な応答を収集します。反応適用における約束の連鎖を伴う闘争

import Promise from 'bluebird'; 
import request from 'superagent'; 

// sends a post request to server 
const servercall2 = (args, response) => { 
    const promise = new Promise((resolve, reject) => { 

     const req = request 
      .post(`${baseUrl}/def`) 
      .send(args, response) 
      .setAuthHeaders(); 

     req.endAsync() 
      .then((res) => resolve(res)) 
      .catch((err) => reject(err)); 
    }); 

    return promise; 
}; 

// sends a post request to server 
const servercall1 = (args) => { 
    const promise = new Promise((resolve, reject) => { 

     const req = request 
      .post(`${baseUrl}/abc`) 
      .send(args) 
      .setAuthHeaders(); 

     req.endAsync() 
      .then((res) => resolve({res})) 
      .catch((err) => reject(err)); 
    }); 

    return promise; 
}; 


// function to send request to cgi server to execute actions from ui 
async function makeServerCalls(args, length) { 

    // convert args to two dimensional array, chunks of given length [[1,2,3], [4,5,6,], [7,8]] 

    const batchedArgs = args.reduce((rows, key, index) => (index % length === 0 ? rows.push([key]) 
     : rows[rows.length - 1].push(key)) && rows, []); 

    const responses = []; 

    for (const batchArgs of batchedArgs) { 
     responses.push(
      // wait for a chunk to complete, before firing the next chunk of calls 
      await Promise.all(

       ***// Error, expected to return a value in arrow function???*** 
       batchArgs.map((args) => { 
        const req = request 
         .get(`${baseUrl}/pqr`) 
         .query(args) 

        // I want to collect response from above req at the end of all calls. 
        req.endAsync() 
         .then((response) =>servercall2(args,response)) 
         .then((res) => res); 
       }) 
      ) 
     ); 
    } 

    // wait for all calls to finish 
    return Promise.all(responses); 
} 

export function execute(args) { 
    return (dispatch) => { 

     servercall1(args) 
      .then(makeServerCalls(args, 3)) 
      .then((responses) => { 
        const serverresponses = [].concat(...responses); 
        console.log(serverresponses); 
      }); 
    }; 
} 

エラー:矢印機能で値を返すと予想されます。私はここで間違って何をしていますか?

これは正しい連鎖ですか、それとも最適化できますか?

間にコールが失敗するとどうなりますか?

+0

高く評価されたリード –

答えて

1

これにはAsyncライブラリを使用できます。ホイールを再発明する必要はありません。

シリーズで実行される関数のリストを取得するwaterfall関数があります。関数1の結果を関数2に関数3に渡すことができます。完全なwaterfallが実行されると、コールバックの結果が得られます。あなたはそれについての詳細をドキュメントで読むことができます。

関連する問題