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

Tod*_*nce 2 javascript asynchronous

所以我有两个异步电话转到网络服务......我的第三个方法都需要它们.

你们怎么建议这样做?

我尝试在我的一个方法中设置一个标志(另一个方法调用第三个方法并发送一些数据)...所以在我的第三个方法中我尝试了这个:

 thirdMethod: function (returnedData) {

        if (this.secondFunctionReturned != true) {
            setTimeout(this.thirdMethod, returnedData, 100);
        }
        else {}
Run Code Online (Sandbox Code Playgroud)

但是这个超时没有用(它没有为我传递数据) - 只是想知道你们的想法......并且谢谢.

T.J*_*der 11

大概你从每个异步调用中获取数据,这就是为什么你需要它们才能解雇你的第三个.我将检查每个异步回调是否存在所有必需的数据,如果存在,则触发第三个函数.或者你可以使用一个计数器,但再次,大概你已经有了数据,而计数器只是不必要的额外.

伪:

var dataFromCall1, dataFromCall2;

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

startOtherAsync(function(data) {
    dataFromCall2 = data;
    if (dataFromCall1) {
        thirdFunction(dataFromCall1, dataFromCall2);
    }
});
Run Code Online (Sandbox Code Playgroud)

或者更少耦合:

var dataFromCall1, dataFromCall2;

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

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

function nextStep() {
    if (dataFromCall1 && dataFromCall2) {
        thirdFunction(dataFromCall1, dataFromCall2);
    }
}
Run Code Online (Sandbox Code Playgroud)

或柜台:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

关于以下评论中的问题:

我尝试了一次,然后考虑了这两个同时返回的一个实例......如果它们都在同一时间返回,那么这种情况会不会失败?

好问题,我原本应该解决的问题:不,两个呼叫都不可能同时发生.Web浏览器中的JavaScript是单线程的(除非明确使用Web工作者,否则线程之间的交互是明确的).如果第二次调用完成时第一次调用的回调正在进行中,则第二次回调将排队并仅在第一次回调返回时运行.