带有APDU

时间:2017-06-05 08:43:38

标签: javascript node.js asynchronous

感谢ponury-kostek,我解决了一半问题。初始顺序功能已经起作用。现在我只有一个循环的麻烦。

在这里,我需要按顺序阅读6块顺序数据。我需要做6个请求来改变一个参数,即偏移量(每次增加一个)。

假设我得到了ABCDEF格式的数据,每个数据都是258字节的块。我想按顺序阅读它并将其存储在变量或文件中。

由于函数是异步的,我正在获得AEFDBC或ABFDEC或......

console.log("---get bin "+offset+"---")

我还可以使用promises吗?

代码:

function getBinPromise(){
    var foffset = 0x00;
    var i = 0;
    for(i=0; i<6;){
        getBinChunkPromise(foffset).then(i++)
        foffset = foffset + 0x01;
    } 
}


function getBinChunkPromise(offset){
    return new Promise(function(resolve, reject) {
        GetBinApdu = new
        Buffer( [0x00, 0xB0, offset, 0x00, 0x00] );
        reader.transmit(GetBinApdu, 258, protocol, function (err, data) {
            if(err){
                console.log(err);
                reject(err);
            } else {
                console.log("---get bin "+offset+"---")
                console.log('Data received:', data);
                console.log('Last two:', data[data.length-2], data[data.length-1]);
                fs.appendFileSync("data.txt", data);
                console.log("------");
                resolve(data);
            }
        })
    })
}

对不起,如果这是白痴,我是JS的新手

1 个答案:

答案 0 :(得分:1)

您需要在resolve回调函数中reject / transmit。所以你会得到这样的东西:

function selectAppPromise(){
    return new Promise(function(resolve, reject) {
        SelectAppletApdu = new Buffer( [0x00,  0xA4,  0x04, 0x00, 0x07, 0x60, 0x46, 0x32, 0xff, 0x00, appletoffset, 0x02] );
        console.log("---select app---");
        reader.transmit(SelectAppletApdu, 40, protocol, function (err, data) {
            if (err) {
                console.log(err);
                reject(err);
            } else {
                console.log('Data received:', data);
                console.log('Last two:',data[data.length-2],data[data.length-1]);
                resolve(data);
            }
        });
    })
}

修改

function getBinPromise() {
    var foffset = 0x00;
    var promises = [];
    for (var i = 0; i < 6; i++) {
        promises.push(getBinChunkPromise);
    }
    promises.reduce((prevTask, current) => {
        return prevTask.then(current);
    }, Promise.resolve(foffset)).then(() => {
        console.log('all done');
    });
}
function getBinChunkPromise(offset) {
    return new Promise(function (resolve, reject) {
        GetBinApdu = new Buffer([
            0x00,
            0xB0,
            offset,
            0x00,
            0x00
        ]);
        reader.transmit(GetBinApdu, 258, protocol, function (err, data) {
            if (err) {
                console.log(err);
                reject(err);
            } else {
                console.log("---get bin " + offset + "---");
                console.log('Data received:', data);
                console.log('Last two:', data[data.length - 2], data[data.length - 1]);
                fs.appendFileSync("data.txt", data);
                console.log("------");
                resolve(offset + 0x01);
            }
        })
    })
}