将变量传递给forEach循环中的请求 - 承诺函数

时间:2017-09-20 11:57:58

标签: javascript node.js foreach

我正在调用价格数据的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) {...}

2 个答案:

答案 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'];

前添加另一个var
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
    });                 
});
  
      
  1. 声明的变量在声明它们的执行上下文中受到约束。未声明的变量总是全局的。
  2.   

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)

您遇到异步问题。

当您执行forEach时,您将任务推送到node.js待办事项列表。

enter image description here

然后当你停止运行时,它们会被执行并访问id。

enter image description here