在非阻塞回调函数中递归调用父函数
Call the parent function recursively in a non-blocking callback function
是否可以在非阻塞回调函数中递归地调用父函数?
例如: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也有一个。
相关文章:
- 递归函数中断
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 递归|两个函数名
- 将jQuery对象传递到setTimeout递归函数中
- 为什么递归生成器函数没有't在ES2015工作
- 具有嵌套对象数组的 Javascript 对象的递归搜索函数
- 对象与递归函数的比较
- 循环内部的递归函数未按预期工作
- 递归函数返回不正确
- 递归函数编程困境
- 给定一个带有数字的数组,我如何编写一个递归函数,当 2 个元素加起来为一个目标时,它会在数组中查找索引
- JavaScript中的异步函数递归和Bluebird Promises
- 是什么导致了“;无方法”;函数递归调用自身时出错
- bind函数递归传递参数失败
- 使用javascript函数递归地创建一个星形三角形
- 尝试执行两个函数递归时,未定义一个函数
- 如何停止函数递归
- 在javascript中,使用回调函数递归地进行循环控制是很危险的
- 为什么Safari调用函数.递归地应用
- 在javascript中实现函数递归findById有比这更好的方法吗?