当前位置: 首页 > 编程笔记 >

JavaScript 异步功能与承诺相比

公冶嘉
2023-03-14
本文向大家介绍JavaScript 异步功能与承诺相比,包括了JavaScript 异步功能与承诺相比的使用技巧和注意事项,需要的朋友参考一下

示例

async功能不能代替Promise类型;他们添加了使承诺更容易调用的语言关键字。它们是可互换的:

async function doAsyncThing() { ... }

function doPromiseThing(input) { return new Promise((r, x) => ...); }

// 用promise语法调用
doAsyncThing()
    .then(a => doPromiseThing(a))
    .then(b => ...)
    .catch(ex => ...);

// 使用等待语法进行调用
try {
    const a = await doAsyncThing();
    const b = await doPromiseThing(a);
    ...
}
catch(ex) { ... }

使用承诺链的任何函数都可以使用重写await:

function newUnicorn() {
  return fetch('unicorn.json')                     // 来自服务器的fetchunicorn.json
  .then(responseCurrent => responseCurrent.json()) // 将响应解析为JSON
  .then(unicorn =>
    fetch('new/unicorn', {                         // 向“新/独角兽”发送请求 
        method: 'post',                            // 使用POST方法
        body: JSON.stringify({unicorn})            // 将独角兽传递给请求主体
    })
  )
  .then(responseNew => responseNew.json())
  .then(json => json.success)                      // 返回响应的成功属性
  .catch(err => console.log('Error creating unicorn:', err));
 }

可以使用async/重写该函数await,如下所示:

async function newUnicorn() {
  try {
    const responseCurrent = await fetch('unicorn.json'); // 来自服务器的fetchunicorn.json
    const unicorn = await responseCurrent.json();        // 将响应解析为JSON
    const responseNew = await fetch('new/unicorn', {     // 向“新/独角兽”发送请求
      method: 'post',                                    // 使用POST方法
      body: JSON.stringify({unicorn})                    // 将独角兽传递给请求主体
    });
    const json = await responseNew.json();
    returnjson.success                                 // 返回响应的成功属性
  } catch (err) {
    console.log('Error creating unicorn:', err);
  }
}

的这种async变体newUnicorn()似乎返回Promise,但实际上有多个await关键字。每个人都返回了一个Promise,因此实际上我们拥有的是承诺的集合,而不是链条。

实际上,我们可以将其视为function*生成器,每个生成器await都是一个yield new Promise。但是,下一个需要每个承诺的结果才能继续运行该功能。这就是为什么async函数上需要附加关键字(以及await调用promise时的关键字)的原因,因为它告诉Javascript自动为此迭代创建观察者。此迭代完成后,Promise返回的由解析。async function newUnicorn()

实际上,您不需要考虑这一点。await隐藏诺言并async隐藏生成器迭代。

您可以像调用asyncpromise一样调用函数,也可以调用await任何promise或任何async函数。您不需要await异步功能,就像无需使用即可执行promise一样。.then()

async如果要立即执行该代码,也可以使用IIFE:

(async () => {
  await makeCoffee()
  console.log('coffee is ready!')
})()
           

 类似资料:
  • 问题内容: 这是“ 用量角器设置Firefox轮廓”主题的后续。 根据howto,可以使用特殊的“ helper” js代码 设置firefox配置文件,该代码使用和库来动态制作编码的firefox配置文件。 这对我一直有效,直到我尝试 使用多个浏览器并进行配置: 通过此设置,我遇到了一个错误(此处完整回溯): 规范模式与任何文件都不匹配。 据我了解,这意味着使用firefox配置文件的设置缺少密

  • 本文向大家介绍承诺回调和异步/等待,包括了承诺回调和异步/等待的使用技巧和注意事项,需要的朋友参考一下 首先,我们必须了解两个主要概念 同步编程 异步编程 同步编程 它等待每个语句完成执行,然后再转到下一条语句。 如果语句不相互依赖,但是由于它们在队列中,它们仍在等待执行,则此方法可能会减慢应用程序的速度。 异步编程 在移动到下一条语句之前,它不等待当前语句完成执行。例如,调用Web服务并使用Ja

  • 问题内容: 考虑一下代码: 路线: 解决: 上面我在一个嵌套了两个调用,因为它们依赖于父调用返回的数据。 我想做的是 :在所有解析器都已完成而不只是父调用完成后返回解析器。 我无法使用$ q.all(),因为其中有两个调用依赖于第一个调用。 简而言之,必须在完成所有3个调用之后才加载myAppController。 问题答案: 您应该使用chaining promise和$ q服务来解决您的问题。

  • 问题内容: 我已经阅读了几篇有关该主题的文章,但是我仍然不清楚是否与抛出错误之间有区别。例如, 使用Promise.reject 使用抛出 我倾向于仅使用它,因为它更短,但我想知道一个相对于另一个是否有任何优势。 问题答案: 使用一个相对于另一个没有优势,但是,在特定情况下无法使用。但是,这些情况可以解决。 每当您进入promise回调时,都可以使用。但是,如果您在任何其他异步回调中,则必须使用。

  • 问题内容: 我有一个名为PaymentStrategy的服务,已注入我的控制器中。 paymentStrategy中的这种购买方法会触发几种需要顺序调用的方法。当buy()中的所有方法都完成后,需要调用then()。 这可能是微不足道的,但我对棱角还很陌生。 目前,在init()方法之后立即触发buy()。then()。我觉得我们需要将所有这些方法放在一个promise中,并应用$ q.all()

  • 问题内容: 这是一个程序,可将数据从T恤衫网站上抓取,然后将产品信息写入CSV文件。 有3个刮擦功能和1个写入功能。 现在,我正面临一场绝对的噩梦,试图在没有任何第三方库或软件包的情况下实现如何在这里实现承诺。仅凭ES6的本机功能可以做到吗? 由于请求的异步性质,我需要每个函数及其请求在调用下一个函数之前完全完成。这样,我就可以使用下一个函数中的变量。 我怎么能简单地做到这一点而无需重写我的整个代