在异步函数调用中显示变量

问题描述 投票:0回答:3

是否有一种基本方法可以在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);
        }
    });
javascript asynchronous cloud parse-platform
3个回答
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事件。 


0
投票

var firstQueryStatus = { qryDone: false, qryError: false };



0
投票
仅当我们知道要提前等待的任务时才能起作用。如果有一个未面临的任务(例如,循环生成),那么我们必须先对其进行统计。

在启动每个任务时向计数器进行柜台,如果完成的话,如果完成的某个时间点已经完成,则降低了,其余的是一半的任务完成,而其余的则在等待启动。

taskCnt += 1 task1() taskCnt += 1 task2()

在某个点

task1()

完成了,而尚未启动,因此一个
task2()
将假设所有任务都已完成。

在这种情况下,额外的var

closeFnc(taskCnt)
可以帮助。 其他解决方案将是开始进行投票。
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.