是否可以在非阻塞回调函数中递归调用父函数?
例如:
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);
)。
那么,再次,是否有可能将“自调用”递归函数作为回调?
答案 0 :(得分:2)
在这个特定示例中,只需在else output(zipInput)
末尾使用checkValidZip
即可获得合理的行为。
更一般地说,您可能希望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);
答案 1 :(得分:1)
是的,但不是这样的。你可以使用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);
}
对于您喜欢的图书馆,Google本身不提供承诺。 jQuery也有一个。