什么是异步执行?
同步执行
代码是一系列指令,它们按顺序运行。
在代码的正常执行期间,代码中的一个函数可能会调用另一个函数。
在调用另一个函数的时候,被调用的函数开始运行,原代码则被暂时搁置一旁。
当被调用的函数执行完成后,它会返回我们的原始代码和返回值。
我们的原始代码恢复执行,并可以使用该返回值做一些事情。我们将此称为同步执行。
异步执行
与上述相反的,还有一些在原代码正常执行之外运行的代码,我们将这种代码的执行方式称为异步执行。
因为异步执行意味着代码将不是一步一步运行,整个代码的每一步将可能不会仅仅只执行一个指令;或者说异步代码的指令通常与我们其他代码的指令同时运行(并且完全分开)。这段代码在它自己的快乐世界中做事,并且最终是否返回结果也不一定,因此它可能会导致程序出现问题。
例如:
假设我们在网站上运行的 JavaScript 需要来自服务器的数据,那么这个时候我们需要调用一个”向服务器发送请求“以”获取数据“的函数。这个请求可能需要一些时间才能到达服务器并返回我们的网站。与此同时,我们的 JavaScript 的其余部分继续运行。过来一会儿,请求到了服务器,又经过一段时间,函数返回了我们需要的数据。但是我们的 JavaScript 的其余部分本身并没有停下来等返回的数据,原本就还在继续运行,那我们就没有办法简单的将这些数据恢复到我们的原始代码中。
这时候我们需要做什么?
想办法将数据返回到原始代码中来处理它吗?
不,我们只需要告诉异步函数在完成时要做什么。
在 JavaScript 中,这通常看起来像将回调函数作为参数传递。
var do_something_cool = function (result) {
console.log(result);
};
var original_function = function () {
// You can define a function inline.
other_function(function (result) {
// this is called by function_that_does_something_asynchronous
do_something_cool(result);
});
};
var original_function = function () {
// You can also pass a function by reference.
// This will do the exact same thing as the example above.
other_function(do_something_cool);
};
var original_function = function () {
// But this would not work. Don't do this.
var result = other_function();
do_something_cool(result);
};
如果您选择提供回调,异步函数的文档应该告诉您可以期望回调函数接收哪些类型的数据。