如何在 JavaScript 中返回异步调用结果?
异步编程在 JavaScript 网络编程中相当常见。在这种方法中,我们可以下载或执行一些依赖时间的任务,而不会阻塞当前的执行流程。与我们的程序相比,它异步执行,可以使用 JavaScript 中的异步函数来完成。在本文中,我们将讨论在 JavaScript 中返回异步调用结果的技术。
在深入了解这个概念之前,让我们看看在异步执行调用生效时,哪些情况会让开发者感到困惑。让我们看看以下情况。
语法
function aTrivialFunction() {
ajaxCall(..., function onSuccess(result) {
// somehow return result from this function
});
}
Display ('result of aTrivialFunction', aTrivialFunction() );
在这种情况下,我们使用的是 AJAX 调用,它代表了一种更通用的模式,即同步调用并返回异步函数的结果。在 JavaScript 中,不可能将异步调用转换为同步调用。在本文的后面部分,我们将讨论异步调用如何工作以及如何返回结果。
异步函数有几种不同的类型。这些列在下面:
回调 - 异步函数可以是回调函数。这可以作为参数传递给其他函数,并在完成时使用所需的值调用。回调函数可以用一个例子来解释,让我们考虑上面代码中描述的 ajaxCall 函数,它将回调函数作为其第一个参数。当 ajaxCall 完成其 HTTP 请求时,将调用此回调函数。我们的回调函数将请求的结果作为其第一个参数。
Promise - Promise 是 JavaScript 中的新特性,随 JavaScript 版本 ECMAScript 6 (ES2015) 一起出现。我们可以说 Promise 是一个从异步函数同步返回的对象,它可以跟踪该函数的状态。Promise 可以具有以下状态:
等待中:这是初始阶段,既未完成也未拒绝
已完成:当操作成功完成时
已拒绝:当操作由于某些错误条件而失败时
Async/Await - async 和 await 关键字提高了代码的可读性,看起来更同步。可以使用它们来处理冗长的嵌套 Promise。
从异步函数调用中返回结果
为了解决上述问题,我们可以返回一个“Promise”对象,而不返回直接结果。通过返回 Promise,调用函数将在结果到达时立即处理结果。让我们看看解决问题的类似语法。
语法
function aTrivialFunction() {
return new Promise( (resolve, reject) => {
ajaxCall(..., function onSuccess(result) {
resolve( result );
});
});
}
const result = await aTrivialFunction()
Display ( 'result of aTrivialFunction', result );
在上面的语法中,我们返回一个 Promise 对象。这个 Promise 对象是一个立即返回的对象,可用于跟踪异步调用的状态。每当调用 resolve 函数时,它都会发出异步调用已完成的信号,换句话说,Promise 已解决。Promise 也适用于错误情况,但在这个例子中没有显示。为了指示错误,我们可以调用 reject 函数。
我们只有在 async 函数中才能使用 await。因此,如果我们在程序的全局执行上下文中,我们需要将代码包装到异步环境中,语法如下:
语法
(async () => {
const res = await myFunction();
console.log( 'Getting result from asynchronous environment:', res);
})();
结论
不可能将异步函数转换为同步函数。但是,我们不需要这样做。我们可以使用 async 和 await 关键字,使用它们,我们可以以几乎像同步代码一样读取的方式组织代码,并且不会丢失异步代码的可读性和灵活性。如果我们想要一个同步系统,异步编程将是处理此问题的有用方法。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP