将累积值存储在for循环中的函数内的变量中,然后在其他地方调用该变量

时间:2014-03-04 18:06:24

标签: javascript

我无法理解某个特定的概念。

一般问题是将累积值存储在 for循环中的函数内的变量中,然后在其他位置调用该变量。

我将首先解释所有部分:

我调用API来获取密钥的值。电话看起来像这样。

keyName = API.key('keyName'); 
keyName.get(function(err, value) {
   console.log(value);
 });

但是,我需要获得一大堆这些密钥,因此我将调用放入 for循环。我还想将累积值存储在变量 fullString

var fullString = [];

for (var i = 0; i < numberOfKeys; i++) {      
  keyName = API.key('keyName' + i);
  keyName.get(function(err, value) {
    fullString += value;

    console.log(fullString);
  });
}

让我们说:

keyName0 : 'a'
keyName1 : 'b'
keyName2 : 'c'

当循环运行时,我会得到这个(我理解):

a
ab
abc

我不明白的是,如果我在函数之外引用 fullString ,它将返回 null ,即

var fullString = [];

for (var i = 0; i < numberOfKeys; i++) {      
  keyName = API.key('keyName' + i);
  keyName.get(function(err, value) {
    fullString += value;
  });
  console.log(fullString);
}
console.log(fullString);

以上两个console.log都将返回 null ,不应记录完整值,即 abc

1 个答案:

答案 0 :(得分:2)

问题不在于范围界定,而在于异步性。在解决此问题之前,您正在记录fullString的值。 如果您在fullString += value语句之后放置日志调用,您将看到该变量实际上等于abc(在最后一次迭代中)。 但是,因为get()异步fullString将在您调用console.log后更新。

更新 :为了获得最终价值,建议您阅读javascript promises。 AngularJS有一个非常好的实现,由Kris Kowal的Q推导出来,读here

在你的情况下,它会起作用(只是一个想法):

var fullString = keyname.getAll().done(function (data) { return data; });