我无法理解某个特定的概念。
一般问题是将累积值存储在 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
答案 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; });