Javascript 在节点js中循环回调函数
这是一段将数据写入可编程设备并从中读取数据的代码。数据以缓冲区的形式写入设备。“mydata”(AAAD0000)中的值是要写入以读取数据的命令 名为chara3()的函数由写函数和读函数组成,读函数是一个回调函数,在该函数中,命令被传递回读 我的要求是前面提到的'mydata'值,最后两个零是内存地址。我需要读取从0到59的不同内存地址中的数据。即AAAD0000到AAAD0059。所以我当然需要运行一个循环。如果我正在读取第0个位置,代码很好,我也得到了输出,但是当我试图将其放入一个循环中时,代码就乱七八糟了。读取部分未执行 有谁能建议一种更好的方法将数据从第0个内存位置读取到第59个内存位置(AAAD0000到AAAD0059) 第一个命令写入它 然后读取数据 内存位置增加了1 这应该重复到59次Javascript 在节点js中循环回调函数,javascript,node.js,Javascript,Node.js,这是一段将数据写入可编程设备并从中读取数据的代码。数据以缓冲区的形式写入设备。“mydata”(AAAD0000)中的值是要写入以读取数据的命令 名为chara3()的函数由写函数和读函数组成,读函数是一个回调函数,在该函数中,命令被传递回读 我的要求是前面提到的'mydata'值,最后两个零是内存地址。我需要读取从0到59的不同内存地址中的数据。即AAAD0000到AAAD0059。所以我当然需要运行一个循环。如果我正在读取第0个位置,代码很好,我也得到了输出,但是当我试图将其放入一个循环中时
var mydata = 'AAAD0000';
function chara3() {
var buff2 = new Buffer(mydata, 'hex');
SensorCharacteristic.write(buff2, false, function(error) { //[0x002d]
console.log('Writing command SUCCESSFUL',mydata);
if (!error) {
SensorCharacteristic.read((error, data) => {
console.log("i just entered");
if (data.toString('hex') != '0000') {
console.log('Temperature History: ', data.toString('hex'));
enter();
}
else {
console.log('contains null value');
} //else
});
}
function enter()
{
mydata = (parseInt(mydata, 16) + 00000001).toString(16);
}
}); //.write
} //chara3
没有错误。但是部分代码没有执行。您可以通过将方法包装成承诺来使用递归
async function chara3(mydata = 'AAAD0000') {
if (mydata === 'AAAD0059') {
return;
}
var buff2 = new Buffer(mydata, 'hex');
return new Promise((resolve) => {
SensorCharacteristic.write(buff2, false, function (error) { //[0x002d]
console.log('Writing command SUCCESSFUL', mydata);
if (!error) {
SensorCharacteristic.read(async (error, data) => {
console.log("i just entered");
if (data.toString('hex') != '0000') {
console.log('Temperature History: ', data.toString('hex'));
let next = await chara3(enter())
return resolve(next);
}
else {
console.log('contains null value');
return resolve();
} //else
});
}
}); //.write
});
} //chara3
function enter() {
return (parseInt(mydata, 16) + 00000001).toString(16);
}
另外,如果你能将你的方法转换为SensorCharacteristic.write和SensorCharacteristic.read
到你可以简单映射的承诺
function chara3(mydata) {
var buff2 = new Buffer(mydata, 'hex');
await SensorCharacteristic.write(buff2, false);
console.log('Writing command SUCCESSFUL', mydata);
let data = await SensorCharacteristic.read();
if (data.toString('hex') != '0000') {
console.log('Temperature History: ', data.toString('hex'));
enter();
} else {
console.log('contains null value');
}
};
let promiseArray = Array(60).fill().map((_, i) => (parseInt('AAAD0000', 16) + i).toString(16)).map(chara3);
Promise.all(promiseArray).then(() => console.log('done'));
您可以使用npm循环异步方法,或者从
bluebird
或util
使用promisify
方法将回调方法转换为承诺,然后使用promise.all
和所有读取请求。您能给我一个例子吗?我可以用异步循环函数吗??我需要从第0个位置运行到第59个位置?刚刚添加了两种方法来实现答案中需要的内容。谢谢您的帮助。我试了两种密码。但是,对于第二个代码段,它抛出了错误。您必须更改SensorCharacteristic.write
和SensorCharacteristic.read
方法以返回承诺,而不是接受回调。您从1st中得到了什么错误?此处出现意外的令牌chara3错误“let next=wait chara3(enter())”我是否应该从读写方法中删除回调?您无法删除回调,您必须提示这些方法。