Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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 在节点js中循环回调函数_Javascript_Node.js - Fatal编程技术网

Javascript 在节点js中循环回调函数

Javascript 在节点js中循环回调函数,javascript,node.js,Javascript,Node.js,这是一段将数据写入可编程设备并从中读取数据的代码。数据以缓冲区的形式写入设备。“mydata”(AAAD0000)中的值是要写入以读取数据的命令 名为chara3()的函数由写函数和读函数组成,读函数是一个回调函数,在该函数中,命令被传递回读 我的要求是前面提到的'mydata'值,最后两个零是内存地址。我需要读取从0到59的不同内存地址中的数据。即AAAD0000到AAAD0059。所以我当然需要运行一个循环。如果我正在读取第0个位置,代码很好,我也得到了输出,但是当我试图将其放入一个循环中时

这是一段将数据写入可编程设备并从中读取数据的代码。数据以缓冲区的形式写入设备。“mydata”(AAAD0000)中的值是要写入以读取数据的命令

名为chara3()的函数由写函数和读函数组成,读函数是一个回调函数,在该函数中,命令被传递回读

我的要求是前面提到的'mydata'值,最后两个零是内存地址。我需要读取从0到59的不同内存地址中的数据。即AAAD0000到AAAD0059。所以我当然需要运行一个循环。如果我正在读取第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.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())”我是否应该从读写方法中删除回调?您无法删除回调,您必须提示这些方法。