【问题标题】:Async - passing variables and preserving context异步 - 传递变量并保留上下文
【发布时间】:2013-04-29 20:55:05
【问题描述】:

如果你有以下代码:

var asyncConfig = {};
var a, b;
for(var i = 0; i < someValue; i++) {
    // do something with a
    // do something with b
    asyncConfig[i] = function(callback) {
        func(a, b, callback); // func is async
    }
}
// Include some more parallel or series functions to asyncConfig
async.auto(asyncConfig);
  • 如何将变量ab 的值传递给func,以便在for 循环之后执行async.auto(asyncConfig) 时,保留ab 的上下文?

ab 的不同上下文对于 func 的每次执行。)

提前谢谢你!

【问题讨论】:

标签: javascript node.js asynchronous


【解决方案1】:
var asyncConfig = {};
var a, b;
for(var i = 0; i < someValue; i++) {
    // do something with a
    // do something with b
    (function(a,b){
      asyncConfig[i] = function(callback) {
        func(a, b, callback); // func is async
      }
    })(a,b);
}
// Include some more parallel or series functions to asyncConfig
async.auto(asyncConfig);

【讨论】:

  • 有没有人认为我们必须这样做很荒谬?我想要的只是将我当前的一些状态传递给这个任务执行器。在咖啡脚本中,我的代码如下所示:_metadata = do (metadata) -&gt; (callback) -&gt; callback(null, metadata); async.auto(metadata: _metadata) 在我看来,考虑到这种解决方法,将来会出现一些主要错误。
  • 你也可以使用myFunction.bind(null, a, b) ?
【解决方案2】:

使用bind 的可能替代方案:

var asyncConfig = {};
var a, b;
for(var i = 0; i < someValue; i++) {
    // do something with a
    // do something with b
    asyncConfig[i] = func.bind(asyncConfig, a, b);
}
// Include some more parallel or series functions to asyncConfig
async.auto(asyncConfig);

确保检查您使用此支持的环境是否绑定。另外,我将“this”值绑定到asyncConfig,这可能不适合你。

编辑:再次阅读问题,是 a 和 b 原语还是对象/数组?如果它们不是基元,那么您需要克隆它们。

【讨论】:

    猜你喜欢
    • 2016-02-19
    • 2017-03-28
    • 1970-01-01
    • 2022-10-12
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多