广告
返回顶部
首页 > 资讯 > 前端开发 > html >如何使用顶层await简化JS
  • 294
分享到

如何使用顶层await简化JS

2024-04-02 19:04:59 294人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关如何使用顶层await简化js,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。javascript 是一种流行的编程语言,最初被设计为单线程和同

这篇文章将为大家详细讲解有关如何使用顶层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目录下创建src目录。注意使用mjs作为文件后缀名。

$ touch app.mjs  $ touch exp.mjs  $ ls -1 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("../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('../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 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 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”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 如何使用顶层await简化JS

本文链接: https://www.lsjlt.com/news/80258.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 如何使用顶层await简化JS
    这篇文章将为大家详细讲解有关如何使用顶层await简化JS,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JavaScript 是一种流行的编程语言,最初被设计为单线程和同...
    99+
    2022-10-19
  • JS中如何使用async与await
    小编给大家分享一下JS中如何使用async与await,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、asyncasync创建一个异步函数来定义一个代码块,在其...
    99+
    2023-06-22
  • JS中如何优雅的使用async await详解
    目录jQuery的$.ajax Webpack时代的开始 深入了解Promise 消灭嵌套 await-to-js 总结jQuery的$.ajax 在开始之前我们先来聊聊我的js异...
    99+
    2022-11-12
  • 如何使用ReduxToolkit简化Redux
    目录一、安装Redux Toolkit和React-Redux二、创建Redux Store三、在React中使用Redux Store四、创建一个Redux State Slice...
    99+
    2022-12-22
    Redux Toolkit Redux Toolkit原理
  • 如何使用ES6简化代码
    小编给大家分享一下如何使用ES6简化代码,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用 ES6 简化代码ES6 已经发展很多年了,兼容性也已经很好了。恰当地使...
    99+
    2023-06-27
  • 如何使用Redux Toolkit简化Redux
    目录Redux Toolkit解决的问题它包括什么?Redux Toolkit API的主要功能?createSlice有什么特别之处?处理异步Redux流最后的想法了解Redux ...
    99+
    2022-11-12
  • 如何使用CSS3+js实现简单的时钟特效
    小编给大家分享一下如何使用CSS3+js实现简单的时钟特效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!html代码如下:<...
    99+
    2022-10-19
  • 如何使用HTML和JS实现简单的计算器
    这篇文章主要介绍了如何使用HTML和JS实现简单的计算器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。   <!doctypehtm...
    99+
    2022-10-19
  • 如何使用JS简单实现apply、call和bind方法
    这篇文章主要讲解了“如何使用JS简单实现apply、call和bind方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用JS简单实现apply、call和bind方法”吧!1.方法介...
    99+
    2023-06-29
  • WPF中如何使用CallerMemberName简化InotifyPropertyChanged
    这篇文章主要介绍“WPF中如何使用CallerMemberName简化InotifyPropertyChanged”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“WPF中如何使用CallerMembe...
    99+
    2023-07-02
  • 如何使用jQuery简化Ajax开发
    这篇文章主要为大家展示了“如何使用jQuery简化Ajax开发”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用jQuery简化Ajax开发”这篇文章吧。j...
    99+
    2022-10-19
  • 如何使用Python的简化方法
    这篇文章给大家分享的是有关如何使用Python的简化方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。逻辑回归的目标是什么?在逻辑回归中,我们希望根据一个或多个自变量(X)对因变量(Y)进行建模。这是一种分类方法...
    99+
    2023-06-04
  • 如何使用分层画布来优化HTML5渲染
    本篇内容主要讲解“如何使用分层画布来优化HTML5渲染”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用分层画布来优化HTML5渲染”吧!简介通常情况下,在...
    99+
    2022-10-19
  • 如何使用js操作符优化代码
    这篇文章主要介绍“如何使用js操作符优化代码”,在日常操作中,相信很多人在如何使用js操作符优化代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用js操作符优化代码”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-27
  • 如何使用HTML和CSS实现一个简单的层叠式布局
    层叠式布局是前端开发中常见的一种布局方式,它可以实现多个元素的层叠排列,给网页增加美观性和交互效果。在本文中,我们将介绍如何使用HTML和CSS实现一个简单的层叠式布局,并提供具体的代码示例。首先,我们创建一个HTML文件,并添加以下代码:...
    99+
    2023-10-21
    CSS html 层叠式布局
  • js如何使用i18n实现页面国际化
    小编给大家分享一下js如何使用i18n实现页面国际化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!页面引用的插件<scri...
    99+
    2022-10-19
  • js代码格式化工具eslint如何使用
    这篇文章主要介绍“js代码格式化工具eslint如何使用”,在日常操作中,相信很多人在js代码格式化工具eslint如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js代码格式化工具eslint如何使用...
    99+
    2023-06-26
  • C#如何使用MessageHandler简化消息处理
    这篇文章主要介绍“C#如何使用MessageHandler简化消息处理”,在日常操作中,相信很多人在C#如何使用MessageHandler简化消息处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#如何使...
    99+
    2023-07-02
  • 详解如何使用MyBatis简化JDBC开发
    目录1. 前言2. JDBC 存在的缺点3. MyBatis 优化4. MyBatis 快速入门5. 总结1. 前言 JavaEE 企业级 Java 项目中的经典三层架构为表现层,业...
    99+
    2023-01-29
    MyBatis简化JDBC开发 MyBatis简化JDBC MyBatis JDBC
  • springboot如何单独使用feign简化接口调用
    这篇文章主要介绍了springboot如何单独使用feign简化接口调用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。单独使用feign简化接口调用与HttpClient和R...
    99+
    2023-06-29
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作