循环节点 js 中的回调函数



这是一段将数据写入ble设备并从中读取数据的代码。 数据以缓冲区的形式写入设备。 "mydata"(AAAD0000(中的值是为读取数据而编写的命令。

名为chara3((的函数由写入和读取函数组成,这是一个回调函数,其中命令被传回。

我的要求是我之前说过的"mydata">值,最后两个零是内存地址。 我需要读取从 0 到 59 的不同内存地址中的数据。这是AAAD0059 AAAD0000。所以我当然需要运行一个循环。如果我正在读取第 0 个位置,代码非常好,我也得到了输出,但是当我尝试在循环中制作它时,代码都是一团糟。读取部分未执行。

任何人都可以建议从第 0 个内存位置读取数据到第 59 个内存位置(AAAD0000 到 AAAD0059(的更好方法吗???

第一个命令写入它 然后读取数据 内存位置递增 1 这应该重复多达 59

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.writeSensorCharacteristic.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'));

最新更新