感谢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的新手
答案 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);
}
})
})
}