node.js async.series函数没有按顺序完成

时间:2015-05-13 23:50:58

标签: node.js

我试图让一些函数使用async.series串行执行。所有功能都运行但它们没有完成系列。我是node.js的新手,我正在努力解决这个问题。这是我使用的代码。

async.series([
        function(callback){
        printRevision(peripheral, chars);
        callback();
        },
        function(callback){
                setInterface(chars);
        callback();
        },
        function(callback){
                performLoopTest(peripheral, chars, 0);
        callback();
        },
        function(callback){
        verifyResults();
        callback();
        }],
        function(err){
        console.log(err)
        }
    )

function printRevision(peripheral, chars) {
    if (DIS_FWREV_UUID in chars) {
        chars[DIS_FWREV_UUID].read(function(error, data) {
        // Ignore errors; missing FW revision is OK
            if (data) {
                console.log(
                    "Bootloader firmware revision: " +
                    data.toString('ascii'));
                }

        });
    } 
    else {
    }
}

function setInterface(chars) {
    var buf = new Buffer(4);
    var byteBuf = new Buffer(1);
    var retBuf = 0;
    var uint8Buf = 0;

    console.log("Setting interface to RS232")

    packet = chars[GIM_CONTROL_CHAR_UUID];
    byteBuf.writeUInt8(GIM_SET_INTERFACE_RS232, 0);
    packet.write(byteBuf, false, function(err) {
        checkError(err);
        console.log("set interface done")
    }); 
}

function performLoopTest(peripheral, chars, writeIndex) {
    var byteBuf = new Buffer(1);
    control = chars[GIM_TX_CHAR_UUID];
    packet = chars[GIM_RX_CHAR_UUID];  
    for (var i = 0; i < WRITE_BUFF_MAX_LEN; i++) {
        byteBuf.writeUInt8(writeBuf[i], 0);
        console.log("sending data");
        packet = chars[GIM_RX_CHAR_UUID];
        packet.write(byteBuf, false, function(err) {
            checkError(err);
        });
    }
}

function verifyResults() {
    console.log(writeBuf);
    console.log(readBuf);   
}

function saveLatestData(data) {
   console.log(data);
   readBuf.push(data);
}

以下是我从上面代码中获得的输出。它似乎只是跳到了整个地方。关于我做错什么的任何想法?

Setting interface to RS232
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
sending data
[ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55,                 56, 57 ]
[]
undefined
Bootloader firmware revision: 1.0.7-release
set interface done

1 个答案:

答案 0 :(得分:0)

您的异步系列正在调用函数,这些函数又调用aria-disabled,它本身是异步的。因此,在开始packet.write()之后,系列数组中的函数会返回。但是write()是异步的,因此它最终会在未来的某个未确定的时间结束。

如果你需要它们按顺序运行,请不要调用write()(基本上说&#34;好的,我已完成,运行系列中的下一个功能)调用函数。而是在异步函数回调中调用callback()

例如,在异步系列数组中不是这样:

callback()

...做更像这样的事情:

function(callback){
    printRevision(peripheral, chars);
    callback();
}

...然后更改function(callback) { printRevision(peripheral, chars, callback); }

printRevision()

请注意,我还没有测试过这段代码,但希望能为您提供这个想法。

您必须对异步系列数组中的其他函数进行类似的更改。