我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用顶层await简化JS

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用顶层await简化JS

这篇文章将为大家详细讲解有关如何使用顶层await简化JS,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

JavaScript 是一种流行的编程语言,最初被设计为单线程和同步的语言,意味着程序需要在不等待获取外部资源或者耗时的计算的情况下一步一步的运行。如果脚本需要这样的资源或计算,这种同步行为将导致错误。这会阻塞队列中的所有其他进程运行,无论它们是否依赖于那些阻塞中的任务。

但很久以前,JavaScript 引入了一个机制让其可以在等待外部资源或者耗时任务的时候去执行其剩余的代码。这种异步行为是通过在函数上使用回调或 promise 来实现的。

什么是回调和promise

我将通过代码来解释这些概念。如果你已经知道回调和 promise 是什么,请直接跳到顶层 await 部分和示例应用程序。

回调

在回调中,一个函数作为参数传递给另一个函数;因此,下面 addEventListener 函数中的第二个参数是回调函数。此回调将等待第一个 click 事件发生,然后才执行第二个参数。

const x = document.getElementsByTagName('Button');  x[0].addEventListener('click',() =>{alert("I was clicked")})

这种等待行为使代码异步。这与同步代码不同,它可以接着一步一步的运行,而不需要等待资源下载或者耗时进程结束。但要注意,并非所有回调函数都是异步的。

Promises

Promises 类似于回调,它将函数附加到返回的对象上。但Promises和回调也有不同,Promises 是专门为异步方法设计的。它们只有一个参数和一个用来获得返回结果的 then() 函数。此外,它还可以链式的附加多个.then() 和 catch() 函数。

fetch('www.xyz.com/api')  .then((res)=>{let x = res.data; //do something with received data})  .catch((err)=>{console.log(err)})

Promises使用事件队列并严格遵循异步任务被链接的顺序来执行。

Async/await

Async/await 是对 Promises 的语法改进,以避免链式调用。它能使代码更清晰,更容易理解。await 关键字使代码暂停,直到 Promises 成功(resolved)或者失败(resolved)。

async function asyncwaitcode(){    let getData = await axios('www.xyzdata.org/api')    console.log(getData.data)  }

什么是顶层 await

以上所有示例都让功能块中的代码异步,没有一个在模块级工作。

但是,异步行为是可以在模块级别实现的。使用顶级 await 的模块会在异步初始化其命名空间后,再通知该模块的消费者继续执行它自己的代码。

下面的示例代码展示了如何使用顶级 await。

关于App

此应用将从新闻 API 中获取最热门的新闻数据,并在浏览器中呈现。用户还能以相关搜索词的进行新闻数据搜索。在开始之前,有几点需要注意:

  •  顶级await在node 13.3及更高版中被支持

  •  顶级await只在ECMAScript模块中支持,但Node.js和Express都是CmmonJS模块。CmmonJS不支持顶级await特性。所以我在代码中会使用import而不是require

  •  在node 14.x之前,顶级await不能直接使用,需要启用--harmony

  •  循环引用模块可能会导致死锁

构建App

  1.  创建toplevelawait目录

$ mkdir toplevelawait

  2.  npm init初始化

$ npm init

  3.package.json中增加"type": "module",以支持ECMAScript模块

"author": "",  "license": "ISC",  "type": "module",

 4.在toplevelawait目录下创建class="lazy" data-src目录。注意使用mjs作为文件后缀名。

$ touch app.mjs  $ touch exp.mjs  $ ls -1 class="lazy" data-src  app.mjs exp.mjs

  5.  安装依赖axios, ejs和 express

$ npm install axios ejs express --save

  6.  exp.mjs中增加下面代码:

import express from "express"  export const exp = await express();

注意我们是在没有async的情况下使用await。这样express实例会先初始化后再导出給其他模块。你可以用这种方式等待模块中某个实例初始化后完成后,再执行依赖于该模块的代码。

如果一个模块包含了顶层await,那么它的父模块的执行会停止,直到promise完成。但他的兄弟模块会继续执行,和以前的同步模式相同。

要注意Node.js中的模块加载也是同步的,意味着他不能异步的等待资源加载。但你可以在加载或者处理资源的语句前加上await关键字来实现异步等待。

增加news APIs

这个应用使用两个免费的新闻API来获取数据。两个API支持回退依赖行为;如果一个API失败,另一个API将获取数据。这两个API都使用API密钥:

  •  News API[1]

  •  GNews API[2]

在app.mjs文件中插入下面的代码。前面的目标导入axios和在exp.js被初始化的express实例。下一部分设置视图引擎,以便在浏览器中展示。

import { exp } from "./exp.mjs";  import axios from "axios"  exp.set("view engine","ejs");  // dependency fall back  let response = "";  let site = true;  try{     response = await axios('https://newsapi.org/v2/top-headlines?country=us&apiKey=your-api-key');     }   catch{    response = await axios("https://gnews.io/api/v3/top-news?token=your-api-key");    site = false;   }   // Get top news  exp.get('/',function(req,res){    let responseresponse0 = response.data.articles      res.render('main.ejs',{response0: response0, site:site})   })   // search news  exp.get('/search', function(req,res){    res.render("searchnews.ejs")    })  exp.get('/result', async(req, res)=>{    let x = req.query.newtitlesearch;    let response1 = {}    let data = {}    try{      let url = 'https://newsapi.org/v2/everything?q='+x+'&apiKey=your-api-key'      response1 =  await axios(url);   }    catch{      let url = 'https://gnews.io/api/v3/search?q='+x+'&token=your-api-key'      response1 =  await axios(url)    }    res.render('result.ejs', {response1: response1.data.articles, site: site})    })  exp.listen(3000)

最重要的部分是这个try catch块,使用到了顶层await来等待axios去获取数据。如果由于任何原因,axios无法从第一个API获取数据,应用将使用第二个API获取数据。一旦它从API获得数据,express可以在主页上呈现它。

try{     response = await axios('https://newsapi.org/v2/top-headlines?country=us&apiKey=your-api-key');    }   catch{    response = await axios("https://gnews.io/api/v3/top-news?token=your-api-key");    }

接下来提供了一个可以让用户进行搜索的路由:

// search news  exp.get('/search', function(req,res){    res.render("../class="lazy" data-src/view/searchnews.ejs")  })

最后,另一个路径展示搜索结果:

exp.get('/result', async(req,res)=>{    let x = req.query.newtitlesearch;    let response1 = {}    let data = {}    try{      let url = 'https://newsapi.org/v2/everything?q='+x+'&apiKey=your-api-key'     response1 =  await axios(url);    }    catch{      let url = 'https://gnews.io/api/v3/search?q='+x+'&token=your-api-key'      response1 =  await axios(url)    }    res.render('../class="lazy" data-src/view/result.ejs', {response1: response1.data.articles , site: site})    })

写前端界面

应用的最后一部分是为前端页面编写四个.ejs HTML文件。将这些文件保存在“view”文件夹中:

//header.ejs  <!DOCTYPE html>  <head>      <title>newapiapp</title>      <link type="text/css" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" ></head><body>        <nav class="navbar navbar-default">                <div class="container-fluid">                    <div class="navbar-header">                        <a class="navbar-brand" href="#">News app</a>                    </div>                    <div class="collapse navbar-collapse">                        <ul class="nav navbar-nav navbar-right">                               <li><a href="/">Main</a></li>                                            <li><a href="/search">Search</a></li>                           </ul>                         </div>                </div>        </nav>
//main.ejs  <%include('header');%>  <%let rows = response0%>  <%let sitesiterep = site%>  <div name "container">    <div class="row text-center" style="display:flex; flex-wrap:wrap">      <% for(let i = 0; i < rows.length; i++){%>        <div class="col-md-3 col-sm-6 ">                            <div class="thumbnail" >                              <a href="<%-rows[i].url %>">                                <img class="lazy" data-src = "<%= siterep ? rows[i].urlToImage :  rows[i].url  %>">                              </a>                                                        </div>                            <div><%= rows[i].title%></div>                                       </div>          <% } %>    </div>    </div>
//searchnews.ejs  <%- include('header');%>    <h2>Search news </h2>    <form action="/result" method="Get">        <input type ="text" placeholder="news title search" name="newtitlesearch"></input>          <input type="submit" placeholder="submit"></input>             </form>
//result.ejs  <%- include('header');%>  <%let rows = response1%>  <%let sitesiterep = site%>  <div name "container">    <div class="row text-center" style="display:flex; flex-wrap:wrap">      <% for(let i = 0; i < rows.length; i++){%>        <div class="col-md-3 col-sm-6 ">                            <div class="thumbnail" >                              <a href="<%-rows[i].url %>">                                <img class="lazy" data-src = "<%= siterep ? rows[i].urlToImage :  rows[i].url  %>">                              </a>                                                     </div>                            <div><%= rows[i].title%></div>                                           </div>         <% } %>    </div>    </div>

运行app

现在APP已经完成,你可以尝试下。

如果你在使用node.js v13.3 至 v14.0,运行:

$ node --harmony-top-level-await app.js

如果你在使用node.js v14.0以上,你不需要--harmony flag:

$ node app.js

如果你成功构建了这个app,那么恭喜你又学会了一个新的js特性。

关于“如何使用顶层await简化JS”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用顶层await简化JS

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS中如何使用async与await

小编给大家分享一下JS中如何使用async与await,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、asyncasync创建一个异步函数来定义一个代码块,在其
2023-06-22

如何使用ReduxToolkit简化Redux

redux-toolkit是目前redux官方推荐的编写redux逻辑的方法,针对redux的创建store繁琐、样板代码太多、依赖外部库等问题进行了优化,官方总结了四个特点是简易的/有想法的/强劲的/高效的,总结来看,就是更加的方便简单了
2022-12-22

如何使用ES6简化代码

小编给大家分享一下如何使用ES6简化代码,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用 ES6 简化代码ES6 已经发展很多年了,兼容性也已经很好了。恰当地使
2023-06-27

如何使用Python的简化方法

这篇文章给大家分享的是有关如何使用Python的简化方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。逻辑回归的目标是什么?在逻辑回归中,我们希望根据一个或多个自变量(X)对因变量(Y)进行建模。这是一种分类方法
2023-06-04

WPF中如何使用CallerMemberName简化InotifyPropertyChanged

这篇文章主要介绍“WPF中如何使用CallerMemberName简化InotifyPropertyChanged”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“WPF中如何使用CallerMembe
2023-07-02

如何使用js操作符优化代码

这篇文章主要介绍“如何使用js操作符优化代码”,在日常操作中,相信很多人在如何使用js操作符优化代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用js操作符优化代码”的疑惑有所帮助!接下来,请跟着小编
2023-06-27

js代码格式化工具eslint如何使用

这篇文章主要介绍“js代码格式化工具eslint如何使用”,在日常操作中,相信很多人在js代码格式化工具eslint如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js代码格式化工具eslint如何使用
2023-06-26

C#如何使用MessageHandler简化消息处理

这篇文章主要介绍“C#如何使用MessageHandler简化消息处理”,在日常操作中,相信很多人在C#如何使用MessageHandler简化消息处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#如何使
2023-07-02

详解如何使用MyBatis简化JDBC开发

JavaEE 企业级 Java 项目中的经典三层架构为表现层,业务层和持久层.MyBatis 对 JDBC 代码进行了封装,作为一款优秀的持久层框架,专门用于简化JDBC开发.本文主要介绍一下如何使用MyBatis简化JDBC开发,需要的可以参考一下
2023-01-29

如何使用JS简单实现apply、call和bind方法

这篇文章主要讲解了“如何使用JS简单实现apply、call和bind方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用JS简单实现apply、call和bind方法”吧!1.方法介
2023-06-29

springboot如何单独使用feign简化接口调用

这篇文章主要介绍了springboot如何单独使用feign简化接口调用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。单独使用feign简化接口调用与HttpClient和R
2023-06-29

如何使用HTML和CSS实现一个简单的层叠式布局

层叠式布局是前端开发中常见的一种布局方式,它可以实现多个元素的层叠排列,给网页增加美观性和交互效果。在本文中,我们将介绍如何使用HTML和CSS实现一个简单的层叠式布局,并提供具体的代码示例。首先,我们创建一个HTML文件,并添加以下代码:
2023-10-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录