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); };