Javascript中的回调函数

时间:2011-04-28 05:39:19

标签: javascript

我知道ajax调用是异步的,但有些情况需要一些同步执行。例如,

loadMyProfile();
editMyProfile();

这两个javascript函数我想要loadMyprofile()应该完全执行,然后它应该调用editMyProfile()。但这种情况并没有发生,因为它是异步的。我听说回调最好能处理这种情况。那么有人可以解释有关回调和与此示例相关的示例吗?

任何帮助将不胜感激!

谢谢,
KARTHIK

4 个答案:

答案 0 :(得分:2)

  

我知道javascript是异步的

JavaScript不是异步的。语言本身根本不定义异步功能。您已经显示的两个函数调用将按顺序完成,先是loadMyProfile,然后是editMyProfile。 JavaScript确实具有使异步编程更容易的语言功能,但它本身并不定义任何异步操作。

但是,在Web浏览器中运行JavaScript的环境有两个主要的异步功能,(我原谅)我认为是您尝试使用它的环境。

第一个也许最相关的是,默认情况下,ajax调用是异步的。因此,例如,如果您的loadMyProfile函数正在进行ajax调用,则该函数将在ajax调用完成之前返回。这是XMLHttpRequest对象的一个​​功能(非常有用!)。

第二个是Web浏览器中window对象上可用的setTimeoutsetInterval函数。 setTimeout调度在超时(例如,异步)之后调用的函数。 setInterval以一定间隔安排一个名为的函数

回调只是一个在其他事情发生时被调用的函数。 XMLHttpRequest对象接受它在完成时调用的函数等。与setTimeoutsetInterval一起使用的函数是回调函数。事件处理程序是另一种回调,在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)

这绝对不是异步代码。你应该确保loa​​dMyProfile实际上正在做你认为应该做的事情。 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");
}