如何在 Javascript 中返回异步调用的响应?

front end technologyjavascriptobject oriented programming

异步编程在 Javascript 网络编程中相当常见。通过这种方法,我们可以下载或执行一些与时间相关的作业,而无需锁定当前执行流程。与我们的程序相比,它执行异步,可以使用 Javascript 中的异步函数完成。在本文中,我们将讨论在 Javascript 中返回异步调用响应的技术。

在进入概念之前,让我们看看在哪些情况下异步执行调用会让开发人员感到困惑。让我们看看以下情况。

语法

function aTrivialFunction() {
   ajaxCall(..., function onSuccess(result) {
      // 以某种方式从该函数返回结果
   });
}
Display ('result of aTrivialFunction', aTrivialFunction() );

在这种情况下,我们使用 AJAX 调用,它代表一种更通用的模式,即同步调用并返回异步函数的结果。在 JavaScript 中无法将异步调用转换为同步调用。在本文的后面部分,我们将讨论异步调用的工作原理和返回响应。

异步函数有几种不同的类型。这些列在下面−

  • 回调 − 异步函数可以是回调函数。这可以作为参数传递给其他函数,并在完成时使用所需值进行调用。可以通过一个例子来解释回调函数,让我们考虑上面代码中描述的 ajaxCall 函数,它将回调函数作为其第一个参数。当 ajaxCall 完成其 HTTP 请求时,将调用此回调函数。我们的回调函数将把请求的结果作为其第一个参数。

  • Promises − Promises 是 javascript 中的新内容,随 javascript 版本 ECMAScript 6 (ES2015) 一起提供。我们可以说 Promises 是一个从异步函数同步返回的对象,它可以跟踪该函数的状态。Promise 可以具有以下状态−

          待处理:这是初始阶段,既未完成也未拒绝

          已完成:操作成功完成后

         拒绝:当操作由于某些错误情况而失败时

  • Async/Await − async 和 await 关键字增加了代码的可读性,看起来更同步。可以使用它们来处理长嵌套的承诺。

从异步函数调用返回结果

为了解决上述问题,我们可以返回一个"承诺"对象而不返回直接结果。通过返回承诺,调用者函数将在结果到达后立即处理。让我们看看解决问题的类似语法。

语法

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 也带有错误情况,但在此示例中未显示。要指示错误,我们可以直接调用拒绝函数。我们使用 await 关键字来处理 promise。如我们所见,我们可以简单地等待函数返回的 promise。这几乎看起来像同步代码。

我们只能在异步函数中使用 await。因此,如果我们处于程序的全局执行上下文中,我们需要将代码包装到异步环境中,语法可以如下所示−

语法

(async () => {
    const res = await myFunction();
    console.log( 'Getting result fromsynchronous environment:', res);
})();

结论

将异步函数转换为同步函数是不可能的。但是,我们不需要这样做。我们可以使用 async 和 await 关键字,使用它们,我们可以以一种几乎像同步代码一样读取的方式组织我们的代码,并且我们不会失去异步代码的可读性和灵活性。如果我们想要一个同步系统,异步编程将是一种有用的方法来处理这个问题。


相关文章