目录
承诺?承诺。
那呢?
一件事(a)等待另一件事
尝试,抓住,最后
进一步阅读
首页 web前端 css教程 了解异步等待

了解异步等待

Apr 12, 2025 am 09:55 AM

了解异步等待

在为Web编写代码时,最终您需要进行一些可能需要一些时间才能完成的过程。 JavaScript无法真正多任务,因此我们需要一种处理这些长期运行过程的方法。

异步/等待是处理此类基于时间的测序的一种方式。当您需要提出某种网络请求然后使用结果数据时,这尤其适合。让我们挖!

承诺?承诺。

异步/等待是一种承诺。 JavaScript中的承诺是可以具有多个状态的对象(类似于现实生活的对象☺️)。承诺这样做是因为有时我们要求的东西不立即可用,我们需要能够检测到它的状态。

考虑某人要求您保证为他们做些事情,例如帮助他们移动。他们询问的是最初的状态。但是,直到出现并帮助他们移动之前,您才履行对他们的诺言。如果您取消计划,则拒绝了承诺。

同样,在JavaScript中承诺的三个可能的状态是:

  • 待处理:当您第一次致电时,尚不清楚它将返回什么。
  • 实现:这意味着操作成功完成
  • 拒绝:操作失败

这是这些州的承诺的一个例子:

这是满足的状态。我们存储一个名为GetometAcos的承诺,通过解决方案并拒绝参数。我们告诉我们的诺言已经解决,这使我们可以再安装两次。

 const getOmetAcos = new Promise(((分辨,拒绝)=> {
  console.log(“初始状态:对不起,我可以吃一些炸玉米饼吗”);

  解决();
}))
  。然后(()=> {
    console.log(“订购一些炸玉米饼”);
  }))
  。然后(()=> {
    console.log(“这是您的炸玉米饼”);
  }))
  .catch(err => {
    Console.Error(“不!没有炸玉米饼。”);
  });
登录后复制
 >初始状态:对不起,我可以吃点炸玉米饼吗
>订购一些炸玉米饼
>这是你的炸玉米饼
登录后复制

如果我们选择被拒绝的状态,我们将执行相同的功能,但这次拒绝它。现在,将打印到控制台的是初始状态和捕获错误:

 const getOmetAcos = new Promise(((分辨,拒绝)=> {
  console.log(“初始状态:对不起,我可以吃一些炸玉米饼吗”);

  拒绝();
}))
  。然后(()=> {
    console.log(“订购一些炸玉米饼”);
  }))
  。然后(()=> {
    console.log(“这是您的炸玉米饼”);
  }))
  .catch(err => {
    Console.Error(“不!没有炸玉米饼。”);
  });
登录后复制
 >初始状态:对不起,我可以吃点炸玉米饼吗
>不!没有炸玉米饼。
登录后复制

当我们选择待处理状态时,我们将简单地console.log我们存储的内容,getOmetAcos。这将打印出悬而未决的状态,因为那是我们记录下来的承诺所处于的状态!

 console.log(getometAcos)
登录后复制
 >初始状态:对不起,我可以有一些🌮
> Promise {<perdend>}
>订购一些&#x1f32e; s
>这是您的&#x1f32e; s</perdend>
登录后复制

那呢?

但这是一开始让我感到困惑的部分。为了从承诺中获得价值,您必须使用.when()或返回诺言解决方案的东西。如果您考虑一下,这是有道理的,因为您需要捕获最终将是什么(而不是最初),因为它最初将处于等待状态。这就是为什么当我们记录上面的承诺时,我们看到它会打印出诺言{}的原因。在执行中,这一点还没有解决。

在您刚刚看到的那些承诺之上,异步/等待的是句法糖。这是我如何使用它以及安排多次执行的一个小例子。

异步函数炸玉米饼(){
  返回等待Promise.resolve(“然后我不时吃美味的炸玉米饼!”)
};

炸玉米饼()。然后(console.log)
登录后复制

或更深入的例子:

 //这是我们要安排的功能。这是一个诺言。
const addOne =(x)=> {
  返回新的承诺(resolve => {
    settimeout(()=> { 
      console.log(`我添加了一个!现在是$ {x 1}。)
      解决()
    },2000);
  }))
}

//我们将立即记录第一个, 
//然后,Addone Promise将运行,需要2秒
//然后最终控制台。Log将开火
异步函数addAsync(){
  console.log('我有10')
  等待addone(10)
  console.log(`现在我已经完成了!`)
}

addAsync()
登录后复制
 >我有10个
>我添加了一个!现在是11。
>现在我完成了! 
登录后复制

一件事(a)等待另一件事

异步/等待的一种常见用途是将其用于链多个异步调用。在这里,我们将获取一些JSON,我们将使用这些JSON进入下一个获取呼叫,以找出要从第二个API中获取哪种类型的东西。在我们的情况下,我们想访问一些编程笑话,但是我们首先需要从其他API中找出我们想要的类型的报价。

第一个JSON文件看起来像这样 - 我们希望报价类型是随机的:

 {
  “类型”:“随机”
}
登录后复制

考虑到我们刚刚得到的随机查询参数,第二个API将返回看起来像这样的东西:

 {
  “ _id”:“ 5A933F6F8E7B510004CBA4C2”,
  “ en”:“尽管如此,计算机是一个苛刻的任务主管。它的程序必须是正确的,我们希望说的是必须在每个细节上准确地说。
  “作者”:“ Alan Perlis”,
  “ ID”:“ 5A933F6F8E7B510004CBA4C2”
}
登录后复制

我们调用异步函数,然后让它等待去检索第一个.json文件,然后才能从API获取数据。一旦发生这种情况,我们就可以对该响应做一些事情,例如将其添加到我们的页面中。

异步函数getQuote(){
  //从一个获取电话中获取报价的类型,其他所有内容都等待这一点
  令soiteTyPeresponse =等待提取(`https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/quotes.json`)
  令qouteType =等待foiteTyPeresponse.json()()

    //使用我们从第二个通话中的第一个电话中获得的收到的东西,其他所有内容都等待了这一点
  令quoteresponse =等待提取(“ https://programming-quotes-api.herokuapp.com/quotes/” quoteType.type)
  令Quote =等待引用QUONSE.JSON()

  //完成
  console.log('DONE')
}
登录后复制

我们甚至可以使用模板文字和箭头功能简化此内容:

异步函数getQuote(){
  //从一个获取电话中获取报价的类型,其他所有内容都等待这一点
  令quoteType =等待提取(`quates.json`)。然后(res => res.json())

    //使用我们从第二个通话中的第一个电话中获得的收到的东西,其他所有内容都等待了这一点
  让QUOTE =等待提取(`programming-quotes.com/$ {quoteType.type}`)。然后(res => res.json())

  //完成
  console.log('DONE')
}

getQuote()
登录后复制

这是对此过程的动画解释。

尝试,抓住,最后

最终,我们希望将错误状态添加到此过程中。我们有方便的尝试,捕捉,最后阻止。

尝试 {
  //我会尝试为您执行一些代码
}
捕获(错误){
  //我将在此过程中处理任何错误
} 
最后 {
  //我会以任何方式开火
}
登录后复制

让我们重组上面的代码以使用此语法并捕获任何错误。

异步函数getQuote(){
  尝试 {
    //从一个获取电话中获取报价的类型,其他所有内容都等待这一点
    令quoteType =等待提取(`quates.json`)。然后(res => res.json())

      //使用我们从第二个通话中的第一个电话中获得的收到的东西,其他所有内容都等待了这一点
    让QUOTE =等待提取(`programming-quotes.com/$ {quoteType.type}`)。然后(res => res.json())

    //完成
    console.log('DONE')
  }

  捕获(错误){
    console.warn(`我们在这里有一个错误:$ {error}`)
  }
}

getQuote()
登录后复制

我们最终没有在这里使用,因为我们并不总是需要它。这是一个块,无论成功还是失败,它将始终发射。考虑最终在尝试捕捉的任何重复事物时最终使用。我通常将其用于清理。我写了一篇文章,如果您想知道更多。

您最终可能需要更复杂的错误处理,例如一种取消异步函数的方法。不幸的是,没有办法在本地进行此操作,但是值得庆幸的是,凯尔·辛普森(Kyle Simpson)创建了一个名为CAF的库,可以提供帮助。

进一步阅读

异步/等待的解释是从回调开始的,然后承诺,然后使用这些解释来构架异步/等待。由于如今,异步/等待的人都得到了很好的支持,因此我们没有走所有这些步骤。它仍然是不错的背景,尤其是如果您需要维护较旧的代码库。这是我最喜欢的一些资源:

  • 异步JavaScript:从回调到承诺,到异步/等待(Tyler McGinnis)
  • 异步JavaScript与异步/等待(Marius Schulz)
  • 掌握异步JavaScript(James K. Nelson)

以上是了解异步等待的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
Google字体可变字体 Google字体可变字体 Apr 09, 2025 am 10:42 AM

我看到Google字体推出了新设计(Tweet)。与上一次大型重新设计相比,这感觉更加迭代。我几乎无法分辨出区别

如何使用HTML,CSS和JavaScript创建动画倒计时计时器 如何使用HTML,CSS和JavaScript创建动画倒计时计时器 Apr 11, 2025 am 11:29 AM

您是否曾经在项目上需要一个倒计时计时器?对于这样的东西,可以自然访问插件,但实际上更多

HTML数据属性指南 HTML数据属性指南 Apr 11, 2025 am 11:50 AM

您想了解的有关HTML,CSS和JavaScript中数据属性的所有信息。

使Sass更快的概念证明 使Sass更快的概念证明 Apr 16, 2025 am 10:38 AM

在一个新项目开始时,Sass汇编发生在眼睛的眨眼中。感觉很棒,尤其是当它与browsersync配对时,它重新加载

我们如何创建一个在SVG中生成格子呢模式的静态站点 我们如何创建一个在SVG中生成格子呢模式的静态站点 Apr 09, 2025 am 11:29 AM

格子呢是一块图案布,通常与苏格兰有关,尤其是他们时尚的苏格兰语。在Tar​​tanify.com上,我们收集了5,000多个格子呢

如何在WordPress主题中构建VUE组件 如何在WordPress主题中构建VUE组件 Apr 11, 2025 am 11:03 AM

内联式模板指令使我们能够将丰富的VUE组件构建为对现有WordPress标记的逐步增强。

php是A-OK用于模板 php是A-OK用于模板 Apr 11, 2025 am 11:04 AM

PHP模板通常会因促进Subpar代码而变得不良说唱,但这并不是这样的情况。让我们看一下PHP项目如何执行基本的

静态表单提供商的比较 静态表单提供商的比较 Apr 16, 2025 am 11:20 AM

让我们尝试在这里造成一个术语:“静态表单提供商”。你带上html

See all articles