我正在调用价格数据的API,该数据正常运行。但是,我正在尝试将变量=SUMPRODUCT((A5:A65536<>"")/COUNTIF(A5:A65536,A5:A65536&""))
传递给exchange_pair_id
函数。
在forEach循环中,每个then()
的exchange_pair_id都是正确的。但是在asset
函数内部,此变量始终相同(forEach循环中的最后一个值)。
我正在尝试将then()
变量传递给exchange_pair_id
then(function(response) {...}
答案 0 :(得分:1)
这是因为.then()
中的函数在请求 - 承诺解析后执行,这需要一些时间。同时,forEach
- 循环完成并将最后asset
分配给exchange_pair_id
- 在您的代码中,它是一个全局变量,因为缺少适当的声明(见下文)!之后,第一个请求 - 承诺开始解析并执行它们的回调,但此时forEach
- 循环已经完成,因此exchange_pair_id
将始终记录相同的值。
为避免exchange_pair_id
位于全局范围内,您应在,
之后使用;
代替var assets = asset['assets'];
(第二行)。或者只是在exchange_pair_id = asset['exchange_pair_id'];
response.forEach(function(asset) {
var assets = asset['assets'], // <---- use ',' instead of ';'
exchange_pair_id = asset['exchange_pair_id'];
options.uri = exchange_objects[exchange[0]].ticker + '?pair=' + assets[0] + assets[1]; // overwrite to fit the request to Kraken API
console.log(exchange_pair_id) // unique
rp(options).then(function(response) {
key = Object.keys(response['result']);
price_data = response['result'][key];
console.log(exchange_pair_id) // duplicate
});
});
- 声明的变量在声明它们的执行上下文中受到约束。未声明的变量总是全局的。
醇>
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var)
无论如何,我建议您使用let
来声明变量,因为它有时可能会阻止您的代码出现不良行为。请参阅let
上的MDN文档,了解它的作用 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
答案 1 :(得分:0)