异步函数调用中的共享变量

时间:2014-05-29 03:50:14

标签: javascript asynchronous cloud parse-platform

是否有一种在Javascript中在两个异步函数之间共享变量的基本方法?我正在为我的Parse.com应用程序编写一个函数,它同时发送两个查询,第二个函数等待前者的结果。我一直在使用基本的共享布尔值和忙等待循环,但是如果在循环开始之前没有设置布尔值,则循环不会终止(但如果之前已经设置了布尔值,那么状态实际上是在两个回调中共享)。这让我觉得我需要某种形式的“易变”变量,但它似乎并不存在于Javascript中,因为没有像这样的真正的线程功能/优化。如果它有帮助,我添加了一些缩写代码来帮助解释我正在做的事情:

    var firstQueryDone = false;
    var firstResultsError = false;
    var foundUser;
    var foundFollowers;

    ...
    [put some constraints on the query]
    ...

    followersQuery.first({
        success: function(followers) {

            ....

            firstQueryDone = true;
        },
        error: function(error) {
            firstResultsError = true;
            response.error(error);
        }
    });


    .....
    [constraints on new query]
    .....

    commentsQuery.find({
        success: function(comments) {
            while(!firstQueryDone && !firstResultsError);
            if(!firstResultsError) {
                .....
            } else {
                ......
            }
        },
        error: function(error) {
            response.error(error);
        }
    });

2 个答案:

答案 0 :(得分:1)

我不会使用繁忙的等待循环。相反,让成功和错误回调调用存储它们的状态然后调用一个处理的外部方法。

var fComplete = false,
    sComplete = false,
    didError = false;


#.first(
    success: function () {
        fComplete = true;
        checkMethod();
    },
    error: function() {
        fComplete = true;
        didError = true;
        checkMethod();
    }
);
#.second(
    success: function() {
        sComplete = true;
        checkMethod();
    },
    error: function() {
        sComplete = true;
        didError = true;
        checkMethod();
    }
);

function checkMethod() {
    if(fComplete && sComplete) {
        if(didError) {
            //Handle error
        } else {
            //Do success here
        }
    }
}

这样,你就不会有等待循环占用一些资源,你只需要进行状态更改和onStateChange事件。

答案 1 :(得分:0)

我认为使用对象而不是原语可能有所帮助 例如:

var firstQueryStatus = {
    qryDone: false,
    qryError: false
};
相关问题