在非阻塞回调函数中递归调用父函数

Call the parent function recursively in a non-blocking callback function

本文关键字:函数 递归 调用 回调      更新时间:2023-09-26

是否可以在非阻塞回调函数中递归地调用父函数?

例如:

function checkValidZip(zipInput) {
    if (!zipInput.trim().match(/^('d{5})$/g)) {
      userInput("Please enter a valid 5 digit shipping zip code", function(zip){
        //recursively call the parent function to check for valid zip 
        //(and continue to prompt the user until they enter proper zip)
        return checkValidZip(zip);
      });
    }
    //and return (only) the valid zip
    return output(zipInput);
 }
function userInput(param1, callback){
    input = prompt(param1);
    callback(input);
}
function output(param){
   alert(param);
}
checkValidZip(prompt("hello"));
http://jsbin.com/omubab/1/edit

显然,问题是代码将继续执行而不等待调用回调函数(因此在本例中不检查zip),并且直到父函数返回(在本例中为return output(zipInput);)之后才调用递归函数的附加迭代。

那么,再一次,有可能有一个"自我调用"递归函数作为回调吗?

在这个特殊的例子中,您可以通过在checkValidZip的末尾使用else output(zipInput)来获得似乎合理的行为。

更一般地,您可能希望checkValidZip接受回调:

function checkValidZip(zipInput, callback) {
    if (!zipInput.trim().match(/^('d{5})$/g)) {
    userInput("Please enter a valid 5 digit shipping zip code", function(zip){
        //recursively call the parent function to check for valid zip 
        //(and continue to prompt the user until they enter proper zip)
        checkValidZip(zip,callback);
    });
    }
    //and return (only) the valid zip
    else callback(zipInput);
}
checkValidZip(prompt("hello"),output);

是的,但不是这样的。你可以使用Promises

function checkValidZip(zipInput) {
    var promise = new Promise();
    if (!zipInput.trim().match(/^('d{5})$/g)) {
        userInput("Please enter a valid 5 digit shipping zip code", function(zip){
            checkValidZip(zip).done(function () {
                promise.resolve(zip);
            });
        });
    }
    return promise;
}
checkValidZip(prompt("hello")).done(function (zip) {
    console.log("valid zip:", zip);
}

Promises不是原生可用的,谷歌一个你喜欢的库。jQuery也有一个。