2017-07-31 139 views
0

我在執行map(循環)中基於鏈的http請求方法時遇到問題。但它在形式的異步(意味着它執行firstFun然後secondFun),但我希望它以同步方式執行。當第一個樂趣正在調用,然後調用請求方法,並使用對第二樂趣請求的請求響應並調用該方法。如何在node.js的循環(map或_.each)中執行多個http請求方法

這是代碼:

var pipelines = [1, 2, 3, 4]; 
var auth_token = "xxxxxxxx" 

getPipelinesTOTrigger(pipelines , auth_token) 
function getPipelinesTOTrigger(pipelines , auth_token, cb) { 

    pipelines.map(function (pipe) { 
     firstFun(pipe,function (err, data) { 
      if (err) { 
       console.log("err:" + JSON.stringify(err)) 
      } else {daya 
       console.log("first fun return :" + JSON.stringify(data.status)) 
       secondFun(data, function (err, data1) { 
        if (err) { 
         console.log("err:" + err) 
        } else { 
         console.log("second fun return "+JSON.stringify(data1.status)) 

        } 
       }) 
      } 
     }) 

    }) 
} 

function firstFun(pipe, cb) { 
    var pipe = { pipe: pipe } 
    var options = { 
     method: "GET", 
     url:"https://abc.myappdemo.us/api/singlePublish/597ebfcfa5a4ea23a233ce93", 

     headers: { 

      'Content-Type': 'application/json', 
      'Access-Control-Allow-Origin': "*" 
     }, 


      }; 

request(options, function (error, response, body) { 

      if(error){ 
       console.log(error) 
      } 

var jsondata=JSON.parse(body) 
    return cb(null, jsondata) 

}) 
} 

function secondFun(pipe, cb) { 
    var pipe = { data: pipe.pipe * 2 } 
     var options = { 
     method: "GET", 
     url:"https://abc.myappdemo.us/api/singlePublish/597ebfcfa5a4ea23a233ce93", 

     headers: { 

      'Content-Type': 'application/json', 
      'Access-Control-Allow-Origin': "*" 
     }, 

      }; 

request(options, function (error, response, body) { 

      if(error){ 
       console.log(error) 
      } 

var jsondata1=JSON.parse(body) 
    return cb(null, jsondata1) 

}) 

} 

我得到這樣的輸出:

first fun return :"Success" 
first fun return :"Success" 
first fun return :"Success" 
first fun return :"Success" 
second fun return "Success" 
second fun return "Success" 
second fun return "Success" 
second fun return "Success" 

,但我想是這樣的:

first fun return :"Success" 
second fun return "Success" 
first fun return :"Success" 
second fun return "Success" 
first fun return :"Success" 
second fun return "Success" 
first fun return :"Success" 
second fun return "Success" 

請提前幫我解決這個問題。

回答

0

使用Reduce()和Promises按順序執行多個異步調用。

欲瞭解更多詳情,請檢查文章herehere

並嘗試使用下面的代碼它會幫助你的結果。

 // include bluebird in your file 
     var Promise = require("bluebird"); 

     var pipelines = [1, 2, 3, 4]; 

     function getPipelinesTOTrigger(pipelines , auth_token) { 
      return pipelines.reduce((promise, item) => { 
      return promise 
       .then((result) => { 
       return firstFun(item); 
       }) 
       .then((result) => { 
       return secondFun(item); 
       }) 
       .catch(console.error); 
      }, Promise.resolve()); 
     } 

     function firstFun(pipe){ 
      return new Promise(function(resolve, reject) { 
       console.log('first', pipe); 
       resolve({'first': 'Success', 'pipe': pipe}); 
      }); 
     } 

     function secondFun(pipe){ 
      return new Promise(function(resolve, reject) { 
       console.log('second', pipe); 
       resolve({'second': 'Success', 'pipe': pipe}) 
      }); 
     } 

如果您需要第一個有趣的結果,然後收集總結果,請使用以下方法。

return Promise.map(pipelines, function(pipe) { 
     return firstFun(pipe) 
     .then(function(firstFunResult) { 
      //get result from first fun 
      return secondFun(pipe, firstFunResult); 
     }) 
     .then(function(finalResult) { 
     //get Final result from second fun 
     }) 
     .catch(function(err) { 
      //("Error occurred ", err.message, err.stack); 
     }); 
    }) 

希望這會幫助你。

+0

請從https://gist.github.com/anvk/5602ec398e4fdc521e2bf9940fd90f84 –

+0

是它執行精細檢查相同的代碼,但是當使用的HTTP請求方法我那麼它是不是執行同步,我想在第二個函數中使用第一個函數響應。請在上面查看我的代碼。 – Mahesh

+0

好的,然後使用藍鳥的Promise.map方法,並調用你的承諾,因爲它將作爲輸入順序返回第一個輸出到第二個輸出 –

0

我採取了不同的方法使用async waterfall。我用setTimeout()和模擬數據替換了網絡電話。

'use strict'; 

var pipelines = [1, 2, 3, 4]; 
var auth_token = "xxxxxxxx"; 
let async = require('async'); 

getPipelinesTOTrigger(pipelines, auth_token); 

function getPipelinesTOTrigger(pipelines, auth_token) { 
    for (let i = 0; i < pipelines.length; i++) { 
    let pipe = pipelines[i]; 
    async.waterfall([ 
     function (callback) { 
     firstFun(pipe, callback); 
     }, function (data, callback) { 
     secondFun(pipe, data, callback); 
     }], function (err, json) { 
     if (err) { 
     return console.log(`err while processing ${i}, pipe = ${pipe}`, err); 
     } 
     console.log(json); 
    }); 
    } 
} 

function firstFun(pipe, cb) { 
    setTimeout(function() { 
    cb(null, `success - ${pipe}`); 
    }, 2000); 
} 

function secondFun(pipe, data, cb) { 
    setTimeout(function() { 
    cb(null, `firstFun return ${data} secondFun return Success - ${data}`); 
    }, 2000); 
} 

這將產生

firstFun return success - 1 secondFun return Success - success - 1 
firstFun return success - 2 secondFun return Success - success - 2 
firstFun return success - 3 secondFun return Success - success - 3 
firstFun return success - 4 secondFun return Success - success - 4