节点js中的同步动作
synchronous actions in node js
我想运行这三个动作有序进行:
- 打开串口
- 倾听任何变化
- 正在通过串口发送命令
问题是由于node js的异步性,有时在端口开始监听之前就发送了数据。因此,此数据丢失。这是我的示例代码。我该如何解决这个问题?
var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("COM27", {
baudrate: 57600
}, false); // this is the openImmediately flag [default is true]
//***1***open the serialport
serialPort.open(function (error) {
if ( error ) {
console.log('failed to open: '+error);
}
else {
console.log('open');
}
//***2***port is now listening
serialPort.on('data', function (data) {
console.log('data received: ' + data)
})
//***3***send command using serialport
serialPort.write("AJ+APN?\n", function(err, results) {
console.log('err ' + err);
console.log('results ' + results)
})
});
我不知道您使用的串行端口模块,但如果它的行为方式 "standard" 那么:
var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("COM27", { baudrate: 57600 }, false);
//***1*** listen for events on port
serialPort.on('data', function (data) {
console.log('data received: ' + data);
//***2*** open the serialport
serialPort.open(function (error) {
if ( error ) {
console.log('failed to open: '+error);
} else {
console.log('open');
//***3*** send command using serialport -> after port opened
serialPort.write("AJ+APN?\n", function(err, results) {
console.log('err ' + err);
console.log('results ' + results)
});
}
});
为每个应该连续执行的任务创建一个承诺。那么它应该是按要求的顺序简单地链接承诺。
我想运行这三个动作有序进行:
- 打开串口
- 倾听任何变化
- 正在通过串口发送命令
问题是由于node js的异步性,有时在端口开始监听之前就发送了数据。因此,此数据丢失。这是我的示例代码。我该如何解决这个问题?
var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("COM27", {
baudrate: 57600
}, false); // this is the openImmediately flag [default is true]
//***1***open the serialport
serialPort.open(function (error) {
if ( error ) {
console.log('failed to open: '+error);
}
else {
console.log('open');
}
//***2***port is now listening
serialPort.on('data', function (data) {
console.log('data received: ' + data)
})
//***3***send command using serialport
serialPort.write("AJ+APN?\n", function(err, results) {
console.log('err ' + err);
console.log('results ' + results)
})
});
我不知道您使用的串行端口模块,但如果它的行为方式 "standard" 那么:
var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("COM27", { baudrate: 57600 }, false);
//***1*** listen for events on port
serialPort.on('data', function (data) {
console.log('data received: ' + data);
//***2*** open the serialport
serialPort.open(function (error) {
if ( error ) {
console.log('failed to open: '+error);
} else {
console.log('open');
//***3*** send command using serialport -> after port opened
serialPort.write("AJ+APN?\n", function(err, results) {
console.log('err ' + err);
console.log('results ' + results)
});
}
});
为每个应该连续执行的任务创建一个承诺。那么它应该是按要求的顺序简单地链接承诺。