【问题标题】:Passing a variable to a request-promise function inside a forEach loop将变量传递给 forEach 循环内的请求承诺函数
【发布时间】:2018-03-01 11:29:42
【问题描述】:

我正在为正常工作的价格数据调用 API。但是,我正在尝试将变量 exchange_pair_id 传递给 then() 函数。

在 forEach 循环中,每个asset 的 exchange_pair_id 都是正确的。然而在then() 函数内部,这个变量总是相同的(forEach 循环中的最后一个值)。

我正在尝试将exchange_pair_id 变量传递给then(function(response) {...}

response.forEach(function(asset) {
    var assets = asset['assets'];
        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
    });                 
});

【问题讨论】:

  • 如果您使用“let exchange_pair_id = asset['exchange_pair_id'];”,这应该可以工作。试试吧,因为你每次都在回调函数的上下文中定义 exchange_pair_id
  • @MarouenMhiri 想说的是,您必须确保正确地确定变量的范围。每个没有关键字varletconst 的变量都是全局变量。你希望它们在你的 forEach 中作用域,所以写 var exchange_pair_id; 很重要。
  • 感谢两位,非常业余的错误让我今天早上吵了几个小时。不理解正确的变量声明是我的错。

标签: javascript node.js foreach


【解决方案1】:

您遇到了异步问题。

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

然后,当您停止函数时,它们会被执行并访问 id。

【讨论】:

    【解决方案2】:

    这是因为.then() 中的函数在request-promise 解决后执行,这需要一些时间。与此同时,forEach-loop 完成并将最后一个asset 分配给exchange_pair_id - 在您的代码中这是一个全局变量,因为缺少正确的声明(见下文)!之后,第一个 request-promises 开始解析并执行它们的回调,但此时 forEach-loop 已经完成,因此 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
        });                 
    });
    
    1. 声明的变量在声明它们的执行上下文中受到约束。未声明的变量始终是全局变量。

    (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

    【讨论】:

      猜你喜欢
      • 2013-06-19
      • 2017-07-16
      • 2016-01-01
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多