javascript - 如何使 for 循环等待回调响应值

标签 javascript jquery callback settimeout

我有一个调用FireCallBackEvents的点击事件,从那里我传递了所有都是回调的函数数组。现在我想在function a()之后调用function b(),它给出了我通过setTimeout()调用的回调结果。我预计它会延迟给出结果。

现在,在下面的代码中,在调用函数 b 和 c 后调用第一个函数回调的警报。

这只是我的真实代码的示例。

function FireCallBackEvents(){
    generalizeCallBack([a,b,c]);
}

function a(parameter1, parameter2,callback){
    alert("Hello World: " + parameter1 + " : " + parameter2);
    setTimeout(function(){callback("12")},600);
}
function b(parameter1, parameter2,callback){
    alert("Hello World1: " + parameter1 + " : " + parameter2);
    callback("123");
}
function c(parameter1, parameter2, callback){
    alert("Hello World2: " + parameter1 + " : " + parameter2);
    callback("1234");
}

function generalizeCallBack(arrayOfFunctions){
    for(var i = 0; i < arrayOfFunctions.length; i++){
        arrayOfFunctions[i]("1","2",function(we){
            alert(we);
        });
    }
}

最佳答案

您可以使用上一个函数的这个变体,它从您传递的回调函数中递归地调用它:

function generalizeCallBack(arrayOfFunctions){
    if (!arrayOfFunctions.length) return; // nothing to do
    var func = arrayOfFunctions.shift(); // extract function to execute
    func("1","2", function(we){
        alert(we);
        generalizeCallBack(arrayOfFunctions); // recurse with shorter array
    });
}

请注意,这会更改您传递的数组。如果您希望调用者保持其数组完好无损,请使用 slice 而不是 shift:

function generalizeCallBack(arrayOfFunctions){
    if (!arrayOfFunctions.length) return; // nothing to do
    var func = arrayOfFunctions[0]; // get function to execute
    func("1","2", function(we){
        alert(we);
        generalizeCallBack(arrayOfFunctions.slice(1)); // recurse with shorter array
    });
}

由于此版本在每次(递归)调用时都会获取数组副本,因此我们可以通过仅在第一次执行此操作来提高效率(如 @Alnitak 所建议):

function generalizeCallBack(arrayOfFunctions){
    function recurse (arrayOfFunctions) {
        if (!arrayOfFunctions.length) return; // nothing to do
        var func = arrayOfFunctions.shift(); // extract first function
        func("1","2", function(we){
            alert(we);
            recurse(arrayOfFunctions); // recurse with shorter array
        });
    }
    // take copy (slice) of array in order not to alter the caller's array:
    recurse(arrayOfFunctions.slice(0));
}

这样,只获取数组的一份副本。递归部分适用于同一个副本,使其在递归链中的长度更短。

这是相同的,但是写成立即调用的函数表达式:

function generalizeCallBack(arrayOfFunctions){
    (function recurse (arrayOfFunctions) {
        if (!arrayOfFunctions.length) return; // nothing to do
        var func = arrayOfFunctions.shift(); // extract first function
        func("1","2", function(we){
            alert(we);
            recurse(arrayOfFunctions); // recurse with shorter array
        });
        // take copy (slice) of array in order not to alter the caller's array:
    }(arrayOfFunctions.slice(0)));
}

关于javascript - 如何使 for 循环等待回调响应值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36931769/

相关文章:

javascript - 使用 jquery 和 for 循环循环 html 表(不是针对每个)

javascript - 如何使 matter.js 的最小示例工作?

javascript - Firebase 部署到另一个站点

php - 获取select选项的值,直接赋值给url参数

javascript - getJSON 完成回调

c - 如何让用户在我的库中提供自己的函数?

c# - 在接口(interface)中实现委托(delegate)

javascript - Toastr 通知未显示在右下角

javascript - 在 for 循环中声明 i 时使用 var

jquery - 分页 JS 停止工作,我不知道为什么