我遇到了一些我期望工作的代码问题。我有一个在函数外定义的变量,因此希望通过继承可以使用该函数。我控制台将变量记录在函数外部,并在函数内部获取值和控制台日志并获取未定义。我在代码中使用了注释来显示这些控制台日志。这里的任何帮助都会很棒。请参阅下面的代码段。谢谢Ant
for (var i = 0; i < parseResult.length; i++) {
var destination = parseResult[i].attributes.userInfo;
for (var i = 0; i < firebaseResult.length; i++) {
if (firebaseResult[i].$id == parseResult[i].attributes.facebookID) {
parseResult[i].attributes.convoID = firebaseResult[i].convoID;
console.log(firebaseResult[i].time); // this returns the timestamp value
parseResult[i].attributes.lastMessage = FirebaseAPI.getLastMessage(firebaseResult[i]).$loaded()
.then(function(lastMessage) {
console.log(firebaseResult[i].time); // this returns undefined
if (!(0 in lastMessage)) {
var returnValue = 'Matched on ' + firebaseResult[i].time;
} else if (0 in lastMessage) {
var returnValue = lastMessage[0].message;
}
return returnValue;
})
.catch(function(error) {
console.log("Error:", error);
})
}
}
}
答案 0 :(得分:2)
使用循环迭代器访问异步回调中的内容通常是不可靠的,因为当回调回来时,i
会增加到让它退出循环的值。
修复程序将其分配给您想要保留的任何变量。
console.log(firebaseResult[i].time); // this returns the timestamp value
var time = firebaseResult[i].time;
parseResult[i].attributes.lastMessage = FirebaseAPI.getLastMessage(firebaseResult[i]).$loaded()
.then(function(lastMessage) {
console.log(firebaseResult[i].time); // this returns undefined
console.log(time);
答案 1 :(得分:1)
这是因为您正在进行FirebaseAPI.getLastMessage()
电话的回调。如果您在其中记录this
(您的范围),您将获得类似FirebaseAPI
对象的内容。
您可以做的是使用经典的var self = this;
技巧来保存您的上下文存储在可通过范围访问的变量中。
这看起来像是:
for (var i = 0; i < parseResult.length; i++) {
var destination = parseResult[i].attributes.userInfo;
for (var i = 0; i < firebaseResult.length; i++) {
if (firebaseResult[i].$id == parseResult[i].attributes.facebookID) {
parseResult[i].attributes.convoID = firebaseResult[i].convoID;
console.log(firebaseResult[i].time); // this returns the timestamp value
// Store your context here
var self = this;
this.results = firebaseResult[i].time;
parseResult[i].attributes.lastMessage = FirebaseAPI.getLastMessage(firebaseResult[i]).$loaded()
.then(function(lastMessage) {
console.log(firebaseResult[i].time); // this returns undefined
// Get your values
console.log(this.results); // this returns your values.
if (!(0 in lastMessage)) {
var returnValue = 'Matched on ' + firebaseResult[i].time;
} else if (0 in lastMessage) {
var returnValue = lastMessage[0].message;
}
return returnValue;
})
.catch(function(error) {
console.log("Error:", error);
})
}
}
}
我在您的代码中看到您正在使用Angularjs
,因此您可以使用$scope
对象来存储范围变量,并轻松处理承诺等。
希望这会有所帮助:)