Javascript变量继承问题

时间:2015-06-30 08:47:08

标签: javascript

我遇到了一些我期望工作的代码问题。我有一个在函数外定义的变量,因此希望通过继承可以使用该函数。我控制台将变量记录在函数外部,并在函数内部获取值和控制台日志并获取未定义。我在代码中使用了注释来显示这些控制台日志。这里的任何帮助都会很棒。请参阅下面的代码段。谢谢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);
                })

        }
    }
}

2 个答案:

答案 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对象来存储范围变量,并轻松处理承诺等。

希望这会有所帮助:)

相关问题