Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点模块中使用异步-如何返回结果?_Javascript_Node.js_Asynchronous_Npm_Async.js - Fatal编程技术网

Javascript 在节点模块中使用异步-如何返回结果?

Javascript 在节点模块中使用异步-如何返回结果?,javascript,node.js,asynchronous,npm,async.js,Javascript,Node.js,Asynchronous,Npm,Async.js,我正在为我的公司编写一个内部NPM模块,以便应用程序可以与我们现有的硬件设备交互,我们已经编写了一个用于与之通信的库。问题是,我尝试编写的一种方法需要异步执行。我希望函数发送一个命令来读取设备,等待它返回(设备库处理这个),然后解析结果。我希望其他开发人员能够调用exports.getResolution()来获取值。以下是我的文件片段及相关部分: var async = require('async'); exports.getResolution = async.series([

我正在为我的公司编写一个内部NPM模块,以便应用程序可以与我们现有的硬件设备交互,我们已经编写了一个用于与之通信的库。问题是,我尝试编写的一种方法需要异步执行。我希望函数发送一个命令来读取设备,等待它返回(设备库处理这个),然后解析结果。我希望其他开发人员能够调用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);

我尝试过回调地狱、承诺、蓝鸟、ES6异步函数和其他一些解决方案,但我就是想不出这一个。我最近的尝试使用async node模块尝试异步执行代码,这是可行的,但现在我只需要获取exports.getResolution以返回最终回调接收的实际值。我做错了什么?我能做些什么来让它工作?谢谢。

正确的方法是为
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看起来是同步的,那么您可能需要签出。但是,您似乎需要修改一些
函数以允许轮询…

尝试使异步调用同步不是一个好主意。您需要做的是注册一个在结果出现时执行的方法。通常这些方法称为回调,但承诺是实现等待异步结果的更好方法

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

谢谢你的回复。如果可能的话,我真的很想避免潜在的回调地狱,但是我很感谢你在回复中投入的时间和思想。