我知道ajax调用是异步的,但有些情况需要一些同步执行。例如,
loadMyProfile();
editMyProfile();
这两个javascript函数我想要loadMyprofile()应该完全执行,然后它应该调用editMyProfile()。但这种情况并没有发生,因为它是异步的。我听说回调最好能处理这种情况。那么有人可以解释有关回调和与此示例相关的示例吗?
任何帮助将不胜感激!
谢谢,
KARTHIK
答案 0 :(得分:2)
我知道javascript是异步的
JavaScript不是异步的。语言本身根本不定义异步功能。您已经显示的两个函数调用将按顺序完成,先是loadMyProfile
,然后是editMyProfile
。 JavaScript确实具有使异步编程更容易的语言功能,但它本身并不定义任何异步操作。
但是,在Web浏览器中运行JavaScript的环境有两个主要的异步功能,(我原谅)我认为是您尝试使用它的环境。
第一个也许最相关的是,默认情况下,ajax调用是异步的。因此,例如,如果您的loadMyProfile
函数正在进行ajax调用,则该函数将在ajax调用完成之前返回。这是XMLHttpRequest
对象的一个功能(非常有用!)。
第二个是Web浏览器中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();
});
}
(该代码在语法上是正确的,它只是使用伪造的函数来避免使细节变得盲目。)
现在,如果我们希望能够在配置文件加载完成后调用editMyProfile
,我们需要让loadMyProfile
接受一个回调函数,它将在加载配置文件时调用:< / p>
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
,这将在调用时调用它适当的时间来了。
答案 1 :(得分:1)
这绝对不是异步代码。你应该确保loadMyProfile实际上正在做你认为应该做的事情。 Firebug是一个很好的工具!
答案 2 :(得分:0)
如果没有看到更多代码,我会推测loadMyProfile
正在执行某种ajax请求。
因此,当运行下一个函数(editMyProfile
)时,代码本身 IS 完成,但是ajax仍在等待它的响应......
如果您想等待ajax请求完成,您需要向我们展示loadMyProfile
函数的代码......
答案 3 :(得分:0)
执行callBack的一种方法是提供在操作后调用的函数。 E.g。
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");
}