Javascript:在转到第三个函数之前测试两个异步调用?

Javascript:在转到第三个函数之前测试两个异步调用?,javascript,asynchronous,Javascript,Asynchronous,所以我有两个异步调用到一个Web服务。。。这两种方法都是我的第三种方法所需要的 你们建议怎么做 我尝试在我的一个方法中设置一个标志(另一个方法调用第三个方法并发送一些数据)。。。因此,在我的第三种方法中,我尝试了以下方法: thirdMethod: function (returnedData) { if (this.secondFunctionReturned != true) { setTimeout(this.thirdMethod, retur

所以我有两个异步调用到一个Web服务。。。这两种方法都是我的第三种方法所需要的

你们建议怎么做

我尝试在我的一个方法中设置一个标志(另一个方法调用第三个方法并发送一些数据)。。。因此,在我的第三种方法中,我尝试了以下方法:

 thirdMethod: function (returnedData) {

        if (this.secondFunctionReturned != true) {
            setTimeout(this.thirdMethod, returnedData, 100);
        }
        else {}

但是这个超时不起作用(它没有为我传递数据)——只是想知道你们怎么想。。。谢谢。

假设您正在从每个异步调用中获取数据,这就是为什么在启动第三个调用之前需要这些数据。我将让每个异步回调检查是否存在所有必需的数据,如果存在,则启动第三个函数。或者您可以使用计数器,但同样,您可能已经有了数据,并且计数器只是不必要的额外数据

伪:

var dataFromCall1, dataFromCall2;

startAsync(function(data) {
    dataFromCall1 = data;
    if (dataFromCall2) {
        thirdFunction(dataFromCall1, dataFromCall2);
    }
});

startOtherAsync(function(data) {
    dataFromCall2 = data;
    if (dataFromCall1) {
        thirdFunction(dataFromCall1, dataFromCall2);
    }
});
或更少耦合:

var dataFromCall1, dataFromCall2;

startAsync(function(data) {
    dataFromCall1 = data;
    nextStep();
});

startOtherAsync(function(data) {
    dataFromCall2 = data;
    nextStep();
});

function nextStep() {
    if (dataFromCall1 && dataFromCall2) {
        thirdFunction(dataFromCall1, dataFromCall2);
    }
}
或柜台:

var counter = 0;

startAsync(function() {
    // ...presumably some processing here...

    // Possibly fire next step
    handleCompletion();
});

startOtherAsync(function() {
    // ...presumably some processing here...

    // Possibly fire next step
    handleCompletion();
});

function handleCompletion() {
    if (++counter === 2) {
        thirdFunction();
    }
}

更新

关于以下评论中的问题:


我试过一次,然后想到一个例子,这两个都同时返回。。。如果他们在同一时间返回,难道不会出现这样的情况吗


好问题,我本来应该解决这个问题:不,两个电话不可能同时发生。web浏览器中的JavaScript是单线程的(除非显式使用,否则线程之间的交互也是显式的)。如果在第二次调用完成时第一次调用的回调正在进行中,则第二次回调将排队并仅在第一次回调返回时运行。

我投票支持T.J.Crowder回答中的计数器方法

但是,另一个没有被建议的选择是,不要一次打两个电话,然后尝试与第三个电话同步,而是一次打一个电话。也就是说,进行第一次异步调用,在其回调中进行第二次异步调用,然后在其回调中进行第三次调用。(T.J.的计数器方法更具可扩展性。)

关于您提到的超时没有为您传递数据的问题,这是因为您试图向
setTimeout
传递太多参数。您需要这样做:

setTimeout(function(){ this.thirdMethod(returnedData); },
           100);

非相关样式注意:在
if
语句中,不需要将一个布尔值与另一个布尔值进行比较。如果(!this.secondFunctionReturned),只需使用
{…
,它更容易阅读。我试过一次,然后想到了一个实例,这两个函数同时返回……如果它们同时返回,难道不会出现这样的情况吗?我喜欢计数器方法,因为无论是2个先决条件调用还是20个,它都能工作。是的,所有的这些看起来很棒…但它们似乎在后续的每个线程中都会变得更好!!!(计数器也是我最喜欢的!)非常感谢!!!!关于您关于两个调用同时返回的问题,我的理解是JavaScript只有一个线程,因此它实际上不会同时处理两个返回。(你可以看到,如果你尝试多次超时。)@toddv:好问题,我本来应该在答案中解决这个问题(现在已经解决了)@nnnnnn是对的:web浏览器上的JavaScript是单线程的,两个回调不可能同时运行。我必须使用它…我开始尝试该方法,但它会以任何方式丢失返回的数据---我在某个地方读到,我可以像上面在setTimeout方法中那样传递参数…但是在这一点上,我什么都不确定。