我知道ajax调用是异步的,但有些情况需要同步执行。例如:
loadMyProfile();
editMyProfile();
这是两个JavaScript函数,我希望loadMyProfile()函数被完全执行后再调用editMyProfile()函数。但是由于它是异步的,所以这种情况并没有发生。我听说回调函数是处理这种情况最好的方法。那么能否有人解释一下回调函数,并提供与此示例相关的示例呢?
任何帮助都将不胜感激!
谢谢, Karthik
我知道ajax调用是异步的,但有些情况需要同步执行。例如:
loadMyProfile();
editMyProfile();
window
对象可用的setTimeout
和setInterval
函数。 setTimeout
会在超时后异步调用一个函数。 setInterval
会按照时间间隔重复调用一个函数。
回调函数指的是当其他事件发生时被调用的函数。例如,XMLHttpRequest
对象接受将在完成时调用的函数等。而你使用的与setTimeout
和setInterval
一起使用的函数,就是回调函数。事件处理程序也是一种回调函数,会在DOM中发生相关事件时被调用。loadMyProfile();
editMyProfile();
loadMyProfile
确实会进行异步的 ajax 调用,从服务器加载个人资料信息并在页面上显示,例如:function loadMyProfile() {
issueAjaxRequest("/some/url", "some data", function() {
// This function is the completion callback for the ajax call.
// It gets called *after* `loadMyProfile` has already returned.
showProfileOnPage();
});
}
function loadMyProfile(callback) {
issueAjaxRequest("/some/url", "some data", function() {
// This function is the completion callback for the ajax call.
// It gets called *after* `loadMyProfile` has already returned.
showProfileOnPage();
// Call the callback if any
if (typeof callback === "function") {
callback();
}
});
}
loadMyProfile(editMyProfile);
editMyProfile
后面没有 ()
。在该语句中,我没有直接调用它,而是将一个引用传递到 loadMyProfile
中,当适当的时间到来时,loadMyProfile
会调用它。XMLHttpRequest
、setTimeout
等)是 JavaScript 代码运行的环境的一部分(在提供它们的实现中)。在这种情况下,是指 Web 浏览器。 - T.J. Crowder这绝对不是异步代码。你应该确保loadMyProfile正在执行你认为它应该执行的操作。Firebug是一个非常好的工具!
回调的一种方法是在操作后提供要调用的函数。例如:
function init() {
callMeFirst('callBack'); //Ask callMeFirst() to execute function callBack() after the execution
}
function callMeFirst(callBackVar) {
//perform the operation here
if(callBackVar != null) {
var functionToCall = eval(callBackVar);
functionToCall();
}
}
function callBack() {
alert("Who called me");
}
没有看到更多的代码,我会猜测loadMyProfile
正在执行某种ajax请求..
因此,当运行下一个函数(editMyProfile
)时,代码本身是完整的,但ajax仍在等待其响应...
如果你想等待ajax请求完成,你需要向我们展示loadMyProfile
函数的代码...
loadMyProfile
的实现才能给您更好的建议。很有可能,它执行的是异步操作,比如提交XMLHttpRequest,这才是您真正想要的。您需要钩入任何异步操作的回调函数,以便实现您所寻求的执行顺序。但是,如果没有实际看到代码,我只是在做假设。 - Jason LeBrun