我知道我可以使用外部变量来识别外部函数需要处理的某些状态。但请考虑一下:如果内部函数是异步的?外部函数不会等待内部函数的变量会改变,那么我现在该如何返回外部函数呢?
function outer() {
var flag = true;
// For example, a jquery-like ajax call
$.ajax({
// Some settings
error: function(jqXHR, textStatus, errorThrown) {
// Here I want to return outer()
flag = false;
}
});
return flag;
}
正如您所看到的,如果我使用flag
作为返回值,outer()
很可能会返回true,因为ajax调用可能需要很长时间。出于同样的原因,我不想设置async: false
因为这会阻止页面反应。
答案 0 :(得分:7)
您的outer
函数会立即返回,因此您始终会将true
作为flag
的值。为了获得正确的值,您需要让异步函数完成其工作并在准备就绪时回复您。考虑一下:
function outer(cb) {
var flag = true;
// For example, a jquery-like ajax call
$.ajax({
// Some settings
error: function (jqXHR, textStatus, errorThrown) {
// Here I want to return outer()
flag = false;
cb(flag);
},
success: function () {
flag = true; // or whatever value you need.
cb(flag);
}
});
}
function callback(flag) {
// this function will be called after the ajax is complete.
// real value of flag variable will be available here
console.log(flag);
}
outer(callback);
将函数作为参数传递给外部函数,并在ajax完成时使用您需要的值作为参数调用该函数。通过这种方式,您将获得真实的结果。