How do I return the response from an asynchronous call? (38个答案)
6年前关闭。
我在使用回调时遇到了麻烦,主要是因为我不了解它们是如何工作的(或应该工作的)。
我有我的职能:
function checkDuplicateIndex(values, callback) {
$.ajax({
type: "POST",
url: url,
data: "command=checkIndexAlbumTracks&" + values,
dataType: "html",
success: function(data){
var returnValue = data.d;
callback(returnValue);
}
});
}
然后在一个提交事件中,如何正确调用checkDuplicateIndex以便我可以alert()值?
最终,这是一个很长的答案,因此,我将尝试将其分成多个部分。
Javascript中的函数
因此,在javascript中,函数是一个可以传递,分配给变量等的对象,就像其他任何数据类型一样。区别在于,函数而不是文本,数字等的字符串,而是等待执行的代码块。
这通常会使刚开始编程的人感到困惑,因为通常在您编写代码时,它将在运行程序时执行。但是对于功能而言,并非如此。当您在函数内部编写代码时,它会等到您调用该函数后再执行。如果不调用该函数,则永远不会执行该代码。让我们看一个简单的例子:
function say_hello(){
console.log('hello!');
}
您在此处看到的称为函数声明。这意味着您正在创建一个函数,该函数是等待执行的代码块。如果运行此代码,则不会将任何内容记录到控制台。现在让我们看一个函数调用。
function say_hello(){
console.log('hello!');
}
say_hello();
因此,在这里我们像以前一样声明该函数,但在下面我们对其进行调用。函数调用只是函数名称,后跟打开和关闭括号。如果该函数接受参数,则它们将位于内部,但现在无需担心。如果要运行此代码,实际上您会看到
hello!
记录到控制台,因为调用了该函数,该函数在内部执行代码。
异步代码
现在,让我们切换一下齿轮。当您进行jquery ajax调用时,jquery将许多代码抽象到库中。他们负责设置
XMLHttpRequest
,将其发射到您指定的位置,然后收集结果,并以跨浏览器工作的方式进行操作。但是由于javascript是异步的,因此ajax调用一旦结束,javascript就会在ajax调用之后继续执行代码,因为谁想要在您仍然
getting in that work的同时等待别人的服务器响应。因此,如果您触发类似这样的操作:
$.ajax({
url: 'http://google.com',
success: function(){ console.log('done!') }
});
console.log('after ajax call');
...您可能会惊讶地发现它在记录
after ajax call
之前记录了
done!
。如前所述,这是因为在javascript中调用
deal with I/O are often asynchronous。
因此,如果进行了ajax调用,并且即使ajax调用尚未完成,它也会立即继续执行代码,我们如何指定完成后将运行的代码?这是所有事物融合在一起的地方。通过为jquery提供一个函数(我们记得这是一个未执行的代码块),我们可以为自己提供一种方法,使自己可以编写仅在ajax调用完成后才执行的代码,方法是将未执行的代码块传递给jquery并谨慎地说“嘿,jquery,获取这段代码,当ajax调用完成时,调用它并传入您从其中获得的任何数据。”多么方便!
我们这样做的方法是通过
jquery's ajax function的
success
和
error
属性。如果请求成功,它将调用我们传递给
success
的函数,并且我假设您可以猜测如果发生错误会发生什么。
放在一起
异步代码和一流的功能是有关javascript的两个最令人困惑的部分,一旦您理解了这两个概念,您将处在一个不错的位置,尽管可能要花一些时间才能到达那里。因此,仔细考虑并进行实验很重要。让我们通过几种方式来处理有关jquery ajax的示例。
首先,我们可以尝试制作自己的函数,并将函数名称传递给成功处理程序。然后,当它返回时,将调用该函数。让我们来看看:
var my_callback = function(data){
console.log(data);
}
$.ajax({
url: 'http://google.com',
success: my_callback
});
这是一种有趣的方式。在这里,我们为变量分配了
anonymous function,然后将变量名称传递给成功处理程序。这样就可以了。现在让我们尝试另一种方式:
function my_callback(data){
console.log(data);
}
$.ajax({
url: 'http://google.com',
success: my_callback
});
在这里,我们定义一个命名函数并执行相同的操作。这将以相同的方式工作。 javascript中的命名函数实际上可以在使用后声明,因此您可以将函数声明移至ajax调用下方,并且仍然可以使用。试试看这是命名函数的一个很好的优点。
最后,让我们看一下第三种处理方式:
$.ajax({
url: 'http://google.com',
success: function(data){
console.log(data);
}
});
在这里,我们在成功处理程序上内联定义一个匿名函数。这与其他两个选项之一完全相同。通过这三种方式,jquery都会接收一个函数声明,并在需要时调用它,即ajax请求返回之后。
我知道这是一个冗长的答案,但是您对此感到困惑的是javascript的一些核心概念,我认为在这里进行遍历比仅解决问题并给出答案会更有用。概念的解释。实际上,我实际上并没有解决您的问题,但是您在理解这些概念之后就可以轻松地自己解决问题。如果您仍然遇到问题,请发表评论,我会尽力澄清更多。