2017-06-05 83 views
0

感谢ponury-kostek我解决了我的一半问题。最初的顺序功能已经起作用。现在我只有一个周期的麻烦。Node.js与APDU的异步请求

这里我需要按顺序读取6个连续数据块。我需要做6个请求改变一个参数,偏移量(每次增加一个)。假设我得到了ABCDEF格式的数据,每个数据都是258个字节的数据组。我想按照这个顺序读取它并将其存储在一个变量或文件中。

由于函数是异步我得到AEFDBC或ABFDEC或...

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

可我也使其与承诺的工作?

代码:

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

你可以添加序列号到APDU? – ThingyWotsit

+0

@ThingyWotsit我不这么认为。我使用这个模块的传输功能https://github.com/santigimeno/node-pcsclite – jm8FE

+0

你有一个关于你的代码的问题,那么你必须告诉我们你的代码。 **“(我认为这是因为它调用了传输函数,在我正在进行数据存储的地方有一个回调函数。”**所以*显示*我们然后我们会告诉你问题出在哪里。它绝对可以用promise来解决,但我们不介意你知道的读者;我们不能猜测你有什么代码。 – ippi

回答

1

您需要resolve/rejecttransmit回调函数。所以,你会得到这样的:

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); 
      } 
     }) 
    }) 
} 
+0

这对我的初始功能起作用,但我应该怎么做一个循环?检查我的编辑在帖子中。对不起,打扰你,你已经帮了我很多 – jm8FE

+0

@ jm8FE试试这个 –

+0

工作正常,我所需要的。 ve得到它。谢谢你的一切!你真棒 – jm8FE