在节点模块中使用异步 - 如何 Return 结果?
Using async In Node Module - How to Return Results?
我正在为我的公司编写一个内部 NPM 模块,以便应用程序可以与我们拥有的硬件设备进行交互,我们已经编写了一个用于与之通信的库。问题是,我尝试编写的一种方法需要异步执行。我希望函数发送命令以从设备读取,等待它到 return(设备库处理这个),然后我解析结果。我希望其他开发人员能够调用 exports.getResolution() 来获取值。这是我的文件的一个片段,其中包含相关部分:
var async = require('async');
exports.getResolution = async.series([
function(callback) {
board.sendAndReceive(bufferlib.generateBuffer("read", "0x00001220", "0x00000004"), (function(received) {
var hex = bufferlib.sortReceivedHex(received);
var status = parseInt('0x' + hex.substring(0, 1), 16);
var verticalResolution = parseInt('0x' + hex.substring(1, 4), 16);
var horizontalResolution = parseInt('0x' + hex.substring(5, 9), 16);
callback(null, {
'status': status,
'vertical': verticalResolution,
'horizontal': horizontalResolution
});
}));
}
],
// optional callback
function(err, results) {
status = results[0];
return results[0];
});
console.log(exports.getResolution);
我尝试过回调地狱、Promises、bluebird、ES6 异步函数和许多其他解决方案,但我就是想不出这个。我最近的尝试使用异步节点模块来尝试异步执行代码,这很有效,但现在我只需要获取 exports.getResolution 到 return 最终回调接收的实际值。我究竟做错了什么?我该怎么做才能完成这项工作?谢谢。
执行此操作的正确方法是为您的 getResolution
函数提供一个回调参数。这才是真正应该做的。
exports.getResolution = function(callback) {
board.sendAndReceive(bufferlib.generateBuffer("read", "0x00001220", "0x00000004"), function(received) {
var hex = bufferlib.sortReceivedHex(received);
var status = parseInt('0x' + hex.substring(0, 1), 16);
var verticalResolution = parseInt('0x' + hex.substring(1, 4), 16);
var horizontalResolution = parseInt('0x' + hex.substring(5, 9), 16);
callback(null, {
'status': status,
'vertical': verticalResolution,
'horizontal': horizontalResolution
});
});
}
console.log(exports.getResolution(function (err, results) {
console.log(results);
}));
以上方式是正确在JS中的做事方式。但是,如果您绝对需要让 getResolution 看起来是同步的,那么您可能需要查看 this answer。但似乎您需要修改一些 board
函数以允许轮询...
尝试使异步调用同步不是一个好主意。您需要做的是注册一个在有结果时执行的方法。通常这些方法称为回调,但 Promises 是完成等待异步结果的更好方法。
exports.getResolution = function() {
return new Promise(function(resolve, reject) {
function receiveHandler(received) {
var hex = bufferlib.sortReceivedHex(received);
var status = parseInt('0x' + hex.substring(0, 1), 16);
var verticalResolution = parseInt('0x' + hex.substring(1, 4), 16);
var horizontalResolution = parseInt('0x' + hex.substring(5, 9), 16);
// If status would say something about it's success you could also
// use reject instead of resolve to indicate failure
resolve({
'status': status,
'vertical': verticalResolution,
'horizontal': horizontalResolution
});
}
board.sendAndReceive(bufferlib.generateBuffer("read", "0x00001220", "0x00000004"), receiveHandler);
}
}
// Usage
exports.getResolution().then(function(response) {
console.log('succesfully received response:', response);
}, function(response) {
console.log('something went wrong:', response)
});
我正在为我的公司编写一个内部 NPM 模块,以便应用程序可以与我们拥有的硬件设备进行交互,我们已经编写了一个用于与之通信的库。问题是,我尝试编写的一种方法需要异步执行。我希望函数发送命令以从设备读取,等待它到 return(设备库处理这个),然后我解析结果。我希望其他开发人员能够调用 exports.getResolution() 来获取值。这是我的文件的一个片段,其中包含相关部分:
var async = require('async');
exports.getResolution = async.series([
function(callback) {
board.sendAndReceive(bufferlib.generateBuffer("read", "0x00001220", "0x00000004"), (function(received) {
var hex = bufferlib.sortReceivedHex(received);
var status = parseInt('0x' + hex.substring(0, 1), 16);
var verticalResolution = parseInt('0x' + hex.substring(1, 4), 16);
var horizontalResolution = parseInt('0x' + hex.substring(5, 9), 16);
callback(null, {
'status': status,
'vertical': verticalResolution,
'horizontal': horizontalResolution
});
}));
}
],
// optional callback
function(err, results) {
status = results[0];
return results[0];
});
console.log(exports.getResolution);
我尝试过回调地狱、Promises、bluebird、ES6 异步函数和许多其他解决方案,但我就是想不出这个。我最近的尝试使用异步节点模块来尝试异步执行代码,这很有效,但现在我只需要获取 exports.getResolution 到 return 最终回调接收的实际值。我究竟做错了什么?我该怎么做才能完成这项工作?谢谢。
执行此操作的正确方法是为您的 getResolution
函数提供一个回调参数。这才是真正应该做的。
exports.getResolution = function(callback) {
board.sendAndReceive(bufferlib.generateBuffer("read", "0x00001220", "0x00000004"), function(received) {
var hex = bufferlib.sortReceivedHex(received);
var status = parseInt('0x' + hex.substring(0, 1), 16);
var verticalResolution = parseInt('0x' + hex.substring(1, 4), 16);
var horizontalResolution = parseInt('0x' + hex.substring(5, 9), 16);
callback(null, {
'status': status,
'vertical': verticalResolution,
'horizontal': horizontalResolution
});
});
}
console.log(exports.getResolution(function (err, results) {
console.log(results);
}));
以上方式是正确在JS中的做事方式。但是,如果您绝对需要让 getResolution 看起来是同步的,那么您可能需要查看 this answer。但似乎您需要修改一些 board
函数以允许轮询...
尝试使异步调用同步不是一个好主意。您需要做的是注册一个在有结果时执行的方法。通常这些方法称为回调,但 Promises 是完成等待异步结果的更好方法。
exports.getResolution = function() {
return new Promise(function(resolve, reject) {
function receiveHandler(received) {
var hex = bufferlib.sortReceivedHex(received);
var status = parseInt('0x' + hex.substring(0, 1), 16);
var verticalResolution = parseInt('0x' + hex.substring(1, 4), 16);
var horizontalResolution = parseInt('0x' + hex.substring(5, 9), 16);
// If status would say something about it's success you could also
// use reject instead of resolve to indicate failure
resolve({
'status': status,
'vertical': verticalResolution,
'horizontal': horizontalResolution
});
}
board.sendAndReceive(bufferlib.generateBuffer("read", "0x00001220", "0x00000004"), receiveHandler);
}
}
// Usage
exports.getResolution().then(function(response) {
console.log('succesfully received response:', response);
}, function(response) {
console.log('something went wrong:', response)
});