【问题标题】:Passing changing value to asynchronous function将更改的值传递给异步函数
【发布时间】:2015-09-24 04:34:44
【问题描述】:

在下面的代码中,我向comb 添加了一个值,尝试在异步函数中使用该值,然后更改comb 的值。由于 comb.pop() 在请求的回调触发之前多次发生,因此请求中的 comb 值并不理想。在搜索了许多有关堆栈溢出的问题后,我尝试在将梳子作为输入的请求周围放置一个闭包,但这不起作用。我该怎么办?

comb = [1,2,3];
arr = [10,20,30];
promises = [];
for (var i = 0; i < arr.length; i++) {
    comb.push(arr[i]);

    var promise = new Promise(function(resolve, reject) {
        request(url, function(err, res, body) {
            // use comb
            if (/* comb meets certain condition */)
                resolve(body);
        });
    });
    promises.push(promise);

    comb.pop();
}

这是我使用闭包的尝试,但没有奏效:

var promise = new Promise(function(resolve, reject) {
    (function(comb) {
        request(url, function(err, res, body) {
            // use comb
            if (/* comb meets certain condition */)
                resolve(body);
        });
    })(comb);
});

【问题讨论】:

  • 向我们展示闭包示例。是的,您需要一个,如果操作正确,它将起作用。
  • 那么你想做什么?像 Promise 实例化时一样使用 comb 副本?
  • 看起来不错,但仅适用于数字等基本类型。对象始终通过引用传递,因此上述解决方案不足以复制对象。像Array.prototype.slice.call(comb) 这样的东西应该能够复制一个数组(仅限浅拷贝)。
  • @PSkocik 您应该编辑您的答案以演示如何使用 slice 复制参数。

标签: javascript node.js asynchronous promise


【解决方案1】:

这适用于简单类型:

  var promise = (function(combCopy){
     var ret = new Promise(function(resolve, reject) {
          request(url, function(err, res, body) {
              //comb refers to the outside comb
              //combCopy refers to the copy
          });
      });
     return ret;
   })(comb);

对象总是通过引用传递,因此将对象作为参数传递不会复制对象。您需要手动执行此操作。

   var promise = (function(){ 
     //this creates a new scope -- something that might not be necessary
     var combCopy = Array.prototype.slice.call(comb); //shallow-only
     var ret = new Promise(function(resolve, reject) {
          request(url, function(err, res, body) {
              //comb refers to the outside comb
              //combCopy refers to the copy
          });
      });
      return ret;
   })();

【讨论】:

  • 我想你忘记了 IIFE 的 comb 参数/参数。也可以只将 Array.prototype.slice... 作为参数传递给您之前最后有 comb 的参数,从而避免额外的语句。
猜你喜欢
  • 2020-08-03
  • 2015-12-01
  • 2020-01-04
  • 1970-01-01
  • 2021-12-29
  • 2011-11-24
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多