2017-07-19 63 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