我正在以并行方式请求Bitstamp API:
// Simplified version
var async = require('async');
var bitstamp = require('bitstamp');
async.parallel([
bitstamp.balance,
bitstamp.ticker
// ...
],
function() (err, result) {
// process results
});
这两种方法是向Bitstamp API发送已签名的请求,包括 nonce 。
Nonce是一个常规整数。它必须随着你提出的每一个要求而增加。在这里阅读更多相关信息。示例:如果在第一个请求中将nonce设置为1,则必须在第二个请求中将其设置为至少2。您不需要从1开始。通常的做法是对该参数使用unix时间。
底层库生成nonce传统方式:
var nonce = new Date().getTime() + '' + new Date().getMilliseconds();
由于异步API调用,有时nonce生成的毫秒数相同,而远程端则希望它们增加。
保持并行请求,是否可以可靠地生成顺序nonce?
我明显的尝试:
this.nonce = new Date().getTime() + '' + new Date().getMilliseconds();
// ... on request
var nonce = this.nonce++;
但它并没有解决问题,相同的毫秒只增加了一个,但仍然相等。
答案 0 :(得分:3)
(这里是npm模块的作者)
我通过在ms时间戳结束时添加自己的计数器来解决它。它现在支持每ms最多999个呼叫because of this function。第一次生成类似1409074885767000
的内容,如果您在同一个ms中需要新的nonce,则会生成1409074885767001
,1409074885767002
,...
答案 1 :(得分:1)
我有完全相同的问题,所以我采用了askmike的代码并略微修改了它。
var nonce = new (function() {
this.generate = function() {
var now = Date.now();
this.counter = (now === this.last? this.counter + 1 : 0);
this.last = now;
// add padding to nonce
var padding =
this.counter < 10 ? '000' :
this.counter < 100 ? '00' :
this.counter < 1000 ? '0' : '';
return now+padding+this.counter;
};
})();
像这样使用
nonce.generate();
答案 2 :(得分:-1)
npm nonce模块现在正确生成