2017-07-19 65 views
-1

我需要從兩個不同的API端點獲取數據,並且在獲取這兩個數據之後,我應該對這些數據執行一些操作(即比較兩個數據源的數據)。同步多個API調用

我知道如何從一個API中獲取數據,然後調用回調函數來處理數據。我這樣做如下。

function getJSON(options, cb) { 
    http.request(options, function(res){ 
     var body = ""; 

     res.on("data", function(chunk){ 
      body += chunk; 
     }); 

     res.on("end", function(){ 
      var result = JSON.parse(body); 
      cb(null, result); 
     }); 

     res.on("error", cb); 
    }) 
    .on("error", cb) 
    .end(); 
} 

var options = { 
    host: "api.mydata1.org", 
    port: 8080, 
    path: "/data/users/3", 
    method: "GET" 
} 

getJSON(options, function(err, result) { 
    if (err) { 
     return console.log("Error getting response: ", err); 
    } 

    // do something with the data 

}); 

現在,我想有這樣的:

var options2 = { 
     host: "api.mydata2.org", 
     port: 8080, 
     path: "/otherdata/users/3", 
     method: "GET" 
    } 

這些將是連接到其他的API的選項,並有一個回調函數將被調用每當數據從兩者都加載了 API。我怎樣才能做到這一點?

+0

查看承諾:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises。這個主題已經在堆棧溢出(例如, [JavaScript等到所有的異步調用完成](https://stackoverflow.com/q/34205266/218196) –

回答

0

我建議使用request-promise模塊,返回表示異步操作,然後你可以使用Promise.all()當兩者都做了跟蹤,然後訪問他們的研究結果的承諾:

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

function getJSON(options) { 
    return rp(options).then(body => { 
     return JSON.parse(body); 
    }); 
} 

let options1 = { 
    host: "api.mydata1.org", 
    port: 8080, 
    path: "/data/users/3", 
    method: "GET" 
}; 

let options2 = { 
     host: "api.mydata2.org", 
     port: 8080, 
     path: "/otherdata/users/3", 
     method: "GET" 
}; 

Promise.all([getJSON(options1), getJSON(options2)]).then(results => { 
    // process results here 
    console.log(results[0]);  // from options1 request 
    console.log(results[1]);  // from options2 request 
}).catch(err => { 
    // process error here 
    console.log(err); 
}); 

你可以閱讀約Promise.all()on MDN。網上有許多關於承諾的文章和教程。這裏是one。它們在ES6 Javascript中是標準的,並且已經通過庫在ES5中使用了多年。它們是Javascript語言中用於管理或協調異步操作的選擇方案。如果你在Javascript中進行任何異步編程(幾乎所有的node.js編程都這樣做),那麼你應該學習承諾。

+0

@wesleyy - 這是否回答你的問題?如果是這樣,您可以通過點擊答案左側的綠色複選標記來向社區表明這一點,這也會爲您贏得一些聲望點。 – jfriend00