Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的回调函数_Javascript - Fatal编程技术网

Javascript中的回调函数

Javascript中的回调函数,javascript,Javascript,我知道ajax调用是异步的,但是有些情况下,比如需要同步执行。比如说, loadMyProfile(); editMyProfile(); 我希望loadMyprofile()应该完全执行这两个javascript函数,然后调用editMyProfile()。但这并没有发生,因为它是异步的。我听说回调将是处理这种情况的最佳方法。那么,有人能解释一下回调和与此示例相关的示例吗 任何帮助都将不胜感激 谢谢, Karthik这绝对不是异步代码。您应该确保loadMyProfile实际执行了您认为应该

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

loadMyProfile();
editMyProfile();

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

任何帮助都将不胜感激

谢谢,

Karthik

这绝对不是异步代码。您应该确保loadMyProfile实际执行了您认为应该执行的操作。Firebug是一个很好的工作工具

在没有看到更多代码的情况下,我推测
loadMyProfile
正在执行某种ajax请求

因此,当下一个函数(
editMyProfile
)运行时,代码本身就完成了,但ajax仍在等待响应


如果要等待ajax请求完成,需要向我们显示
loadMyProfile
函数的代码…

执行回调的一种方法是提供操作后要调用的函数。例如

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");
}
我知道javascript是异步的

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

但是,JavaScript在web浏览器中运行的环境有两个主要的异步特性(请原谅),我认为这就是您尝试使用它的环境

第一个可能也是最相关的是,默认情况下,调用是异步的。例如,如果您的
loadMyProfile
函数正在进行ajax调用,那么该函数将在ajax调用完成之前返回。这是该对象的一个特性(而且非常有用!)

第二个是web浏览器中
窗口
对象上可用的和函数<代码>设置超时计划在超时后调用的函数(例如异步调用)
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
接受一个回调函数,它将在配置文件加载后调用该函数:

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
,它会在适当的时候调用它。

“但这不会发生,因为它是异步的。”证明它。Javascript不是异步的。调用loadMyProfile()时,它将在editMyProfile()启动之前完成执行。我们需要查看
loadMyProfile
的实现,以便为您提供更好的建议。它可能执行异步操作,比如提交XMLHttpRequest,这就是您的实际意思。您需要挂接到异步操作的回调函数中,以实现所需的执行顺序。但实际上我没有看到代码,我只是在假设。@Jason,我想你是对的。。。请看下面我的回答:PThanks我知道ajax调用是异步的,但我忘了在我的帖子中包含这一点,但非常感谢你消除了我对回调的疑虑。我感谢大家的回答。语言本身根本没有定义异步特性。现在已经不那么正确了,有了web工作者@Raze:web工作者不再是JavaScript的一部分。它们(如
XMLHttpRequest
setTimeout
等)是JavaScript代码运行环境的一部分(在提供它们的实现上)。在本例中,是web浏览器。@t-j-crowder,好的,你说的是与执行环境解耦的语言。我应该注意到你说的语言。。。