如何在 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 关键字,使用它们,我们可以以几乎像同步代码一样读取的方式组织代码,并且不会丢失异步代码的可读性和灵活性。如果我们想要一个同步系统,异步编程将是处理此问题的有用方法。

更新于:2022年8月23日

389 次浏览

启动你的 职业生涯

完成课程后获得认证

开始学习
广告
© . All rights reserved.