NodeJS获取asynchronous返回值(callback)

我已经阅读了有关callback的互联网,但我无法理解他们在我的情况。

我有这个function,它运行时logging到控制台。 不过,我现在需要在另一个function这个反应,我正在努力这样做。

var asyncJobInfo = function(jobID, next) { var oozie = oozieNode.createClient({ config: config }); var command = 'job/' + jobID + '?show=info'; console.log("running oozie command: " + command); oozie.get(command, function(error, response) { console.log("*****response would dump to console here:*****"); // console.log(response); return response; }); }; 

这是我应该得到它的地方:(这显然不起作用,因为它不等待响应。)

 exports.getJobInfoByID = function(req, res) { var jobIDParam = req.params.id; res.send(asyncJobInfo(jobIDParam)); } 

我真的很想围绕callback,我盯着自己的眼睛。

callback无法返回值,因为它们将返回的代码已经执行。

所以你可以做一些事情。 一个传递一个callback函数,一旦你的asynchronous函数获得数据调用callback并传递数据。 或者传递响应对象,并在asynchronous函数中使用它

传递callback

 exports.getJobInfoByID = function(req, res) { var jobIDParam = req.params.id; asyncJobInfo(jobIDParam,null,function(data){ res.send(data); }); } var asyncJobInfo = function(jobID, next,callback) { //... oozie.get(command, function(error, response) { //do error check if ok do callback callback(response); }); }; 

传递响应对象

 exports.getJobInfoByID = function(req, res) { var jobIDParam = req.params.id; asyncJobInfo(jobIDParam,null,res); } var asyncJobInfo = function(jobID, next,res) { //... oozie.get(command, function(error, response) { //do error check if ok do send response res.send(response); }); }; 

在asynchronous世界中,你不能返回值。 无论什么时候值已经准备好了,都应该在callback中执行。 另一种select是使用承诺。 您将需要es6-promise软件包:

 var Promise = require('es6-promise').Promise; var asyncJobInfo = function(jobID) { var oozie = oozieNode.createClient({config: config}); var command = 'job/' + jobID + '?show=info'; console.log("running oozie command: " + command); // Creates a new promise that wraps // your async code, and exposes two callbacks: // success, and fail. return new Promise(function(success, fail) { oozie.get(command, function(error, response) { if (error) { fail(error); } else { success(response); } }); }); }; 

现在,您可以使用该承诺并传递一旦解决就运行的callback:

 exports.getJobInfoByID = function(req, res) { asyncJobInfo(req.params.id).then(function(data) { res.send(data) }).catch(function(error) { console.error(error); }); }; 

以上可以缩短:

 exports.getJobInfoByID = function(req, res) { asyncJobInfo(req.params.id) .then(res.send.bind(res)) .catch(console.error); };