当前位置: 首页 > 面试题库 >

在JavaScript循环中使用回调时,是否有任何方法可以保存循环中更新的变量以在回调中使用?[重复]

裴楚青
2023-03-14
问题内容

假设我有以下内容:

for(var i = 0; i < length; i++){
  var variable = variables[i];
  otherVariable.doSomething(variable, function(err){ //callback for when doSomething ends
    do something else with variable;
  }

到回调被调用时,variable将不可避免地成为所有回调的最后一个变量,而不是像我希望的那样为每个回调都不同。我意识到我可以传递variabledoSomething()回调doSomething()函数,然后将其传递回去,但它是外部库的一部分,因此我不想弄乱它的源代码。

你们中那些比我更了解JavaScript的人,是否还有其他方法可以做我想做的事情?

谢谢,


问题答案:

处理这种情况的一种常见方法(如果很难看)是使用另一个函数,该函数立即被调用以创建一个用于保存变量的范围。

for(var i = 0; i < length; i++) {
  var variable = variables[i];
  otherVariable.doSomething(function(v) { return function(err) { /* something with v */ }; }(variable));
}

请注意,在立即调用的函数内部,正在创建并返回的回调将参数引用给函数,v而不是外部variable。为了使阅读效果更好,我建议将回调的构造函数提取为命名函数。

function callbackFor(v) {
  return function(err) { /* something with v */ };
}
for(var i = 0; i < length; i++) {
  var variable = variables[i];
  otherVariable.doSomething(callbackFor(variable));
}


 类似资料:
  • 在测试类中,有一个静态方法返回特定目录中的一组所有文件。 因为该方法调用自身来循环文件,所以我在该方法之外实例化了一组,以添加我找到的文件。第一次调用该方法时效果很好,但第二次调用时,被累加起来,由于return语句,我无法清除它。有什么想法吗? 如果我编写更多的方法,或者每次调用该方法时手动清除集合,我可能会解决这个问题,但这一切似乎都不优雅和干净。

  • 假设我有一些这样的方法: 但我不想调用序列方法: 这很无聊。如果我添加一个新方法:,我需要添加手动:

  • 本文向大家介绍在Python的while循环中使用else以及循环嵌套的用法,包括了在Python的while循环中使用else以及循环嵌套的用法的使用技巧和注意事项,需要的朋友参考一下 循环使用 else 语句 在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况

  • 问题内容: 我只是从node.js开始。我做了一些ajax的工作,但是没有什么太复杂的,所以回调仍然有点麻烦。我看了看异步,但我所需要的只是顺序运行一些功能。 我基本上有一些东西可以从API中提取一些JSON,然后创建一个新的JSON,然后对此进行处理。显然,我不能只运行它,因为它可以一次运行所有内容并且具有空的JSON。通常,流程必须按顺序运行,但是如果在从API中提取JSON时可以在等待时提取

  • 问题内容: 我正在制作一个运行一些cmd命令(USMT和文件传输)的程序 它工作正常,但是只有在完成操作后,我才从文本框中的cmd获取最后一行。我希望它打印cmd实时输出的内容。 问题答案: 问题的根本原因是您阻止了事件调度线程,这将阻止在执行命令后更新UI。 Swing是一个单线程框架,这意味着您不应在EDT上下文中执行阻塞或长时间运行的代码。Swing也不是线程安全的,这意味着永远不要在EDT

  • 问题内容: 我试图用NodeJS编写代码,从外部API抓取数据,然后使用Mongoose在MongoDB中填充它们。在这之间,我将检查该特定对象是否已经存在于Mongo中。下面是我的代码。 我的问题是,由于NodeJS回调是并行的,因此不会按顺序调用它。我的最终结果将是这样的: 呼叫报告API console.log(长度)= 100 ^^^^^^^^^^^^^^^^^^^^^^^^^ conso