国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

使用頂層await簡化JS代碼

開發 前端
JavaScript 引入了一個機制讓其可以在等待外部資源或者耗時任務的時候去執行其剩余的代碼。這種異步行為是通過在函數上使用回調或 promise 來實現的。

[[386526]]

 JavaScript 是一種流行的編程語言,最初被設計為單線程和同步的語言,意味著程序需要在不等待獲取外部資源或者耗時的計算的情況下一步一步的運行。如果腳本需要這樣的資源或計算,這種同步行為將導致錯誤。這會阻塞隊列中的所有其他進程運行,無論它們是否依賴于那些阻塞中的任務。

但很久以前,JavaScript 引入了一個機制讓其可以在等待外部資源或者耗時任務的時候去執行其剩余的代碼。這種異步行為是通過在函數上使用回調或 promise 來實現的。

什么是回調和promise

我將通過代碼來解釋這些概念。如果你已經知道回調和 promise 是什么,請直接跳到頂層 await 部分和示例應用程序。

回調

在回調中,一個函數作為參數傳遞給另一個函數;因此,下面 addEventListener 函數中的第二個參數是回調函數。此回調將等待第一個 click 事件發生,然后才執行第二個參數。 

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

這種等待行為使代碼異步。這與同步代碼不同,它可以接著一步一步的運行,而不需要等待資源下載或者耗時進程結束。但要注意,并非所有回調函數都是異步的。

Promises

Promises 類似于回調,它將函數附加到返回的對象上。但Promises和回調也有不同,Promises 是專門為異步方法設計的。它們只有一個參數和一個用來獲得返回結果的 then() 函數。此外,它還可以鏈式的附加多個.then() 和 catch() 函數。 

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

Promises使用事件隊列并嚴格遵循異步任務被鏈接的順序來執行。

Async/await

Async/await 是對 Promises 的語法改進,以避免鏈式調用。它能使代碼更清晰,更容易理解。await 關鍵字使代碼暫停,直到 Promises 成功(resolved)或者失敗(resolved)。 

  1. async function asyncwaitcode(){  
  2.   let getData = await axios('www.xyzdata.org/api')  
  3.   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目錄

  1. $ mkdir toplevelawait 

    2.  npm init初始化

  1. $ npm init 

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

  1. "author": "",  
  2. "license": "ISC",  
  3. "type": "module", 

   4.在toplevelawait目錄下創建src目錄。注意使用mjs作為文件后綴名。 

  1. $ touch app.mjs  
  2. $ touch exp.mjs  
  3. $ ls -1 src  
  4. app.mjs 
  5. exp.mjs 

    5.  安裝依賴axios, ejs和 express 

  1. $ npm install axios ejs express --save 

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

  1. import express from "express"  
  2. 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實例。下一部分設置視圖引擎,以便在瀏覽器中展示。 

  1. import { exp } from "./exp.mjs";  
  2. import axios from "axios"  
  3. exp.set("view engine","ejs");  
  4. // dependency fall back  
  5. let response = "" 
  6. let site = true 
  7. try{  
  8.    response = await axios('https://newsapi.org/v2/top-headlines?country=us&apiKey=your-api-key');    
  9.  }  
  10.  catch{  
  11.   response = await axios("https://gnews.io/api/v3/top-news?token=your-api-key");  
  12.   site = false 
  13.  }  
  14.  // Get top news  
  15. exp.get('/',function(req,res){  
  16.   let responseresponse0 = response.data.articles    
  17.   res.render('main.ejs',{response0: response0, site:site})  
  18.  })  
  19.  // search news  
  20. exp.get('/search', function(req,res){  
  21.   res.render("searchnews.ejs")    
  22. })  
  23. exp.get('/result', async(req, res)=> 
  24.   let x = req.query.newtitlesearch;  
  25.   let response1 = {}  
  26.   let data = {}  
  27.   try{  
  28.     let url = 'https://newsapi.org/v2/everything?q='+x+'&apiKey=your-api-key'  
  29.     response1 =  await axios(url); 
  30.   }  
  31.   catch{  
  32.     let url = 'https://gnews.io/api/v3/search?q='+x+'&token=your-api-key'  
  33.     response1 =  await axios(url) 
  34.    }  
  35.   res.render('result.ejs', {response1: response1.data.articles, site: site})    
  36. })  
  37. exp.listen(3000) 

最重要的部分是這個try catch塊,使用到了頂層await來等待axios去獲取數據。如果由于任何原因,axios無法從第一個API獲取數據,應用將使用第二個API獲取數據。一旦它從API獲得數據,express可以在主頁上呈現它。 

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

接下來提供了一個可以讓用戶進行搜索的路由: 

  1. // search news  
  2. exp.get('/search', function(req,res){  
  3.   res.render("../src/view/searchnews.ejs")  }) 

最后,另一個路徑展示搜索結果: 

  1. exp.get('/result', async(req,res)=> 
  2.   let x = req.query.newtitlesearch;  
  3.   let response1 = {}  
  4.   let data = {}  
  5.   try{  
  6.     let url = 'https://newsapi.org/v2/everything?q='+x+'&apiKey=your-api-key' 
  7.     response1 =  await axios(url);  
  8.   }  
  9.   catch{  
  10.     let url = 'https://gnews.io/api/v3/search?q='+x+'&token=your-api-key'  
  11.     response1 =  await axios(url)  
  12.   }  
  13.   res.render('../src/view/result.ejs', {response1: response1.data.articles , site: site})    
  14. }) 

寫前端界面

應用的最后一部分是為前端頁面編寫四個.ejs HTML文件。將這些文件保存在“view”文件夾中: 

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

運行app

現在APP已經完成,你可以嘗試下。

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

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

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

  1. $ node app.js 

如果你成功構建了這個app,那么恭喜你又學會了一個新的js特性。

你可以在 ECMAScript TC39 top-level await提案[3] 中獲得更多的信息。 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2024-12-05 14:06:29

JS代碼片段

2021-11-17 16:24:23

JS 代碼函數聲明

2024-05-28 00:03:00

JavaScript開發

2025-04-03 04:11:00

JS代碼URL

2009-07-22 07:47:00

Scala客戶代碼

2023-04-14 08:10:59

asyncawait

2011-01-24 13:20:49

2012-07-22 15:59:42

Silverlight

2017-04-19 08:47:42

AsyncJavascript異步代碼

2017-04-05 15:45:20

2009-07-06 15:20:30

JSP表達式

2022-11-21 09:01:00

Swift并發結構

2017-11-16 16:15:28

Await開發嵌套

2019-11-27 10:05:00

LombokJava編程

2009-06-22 14:26:12

ScalaXML對象

2021-11-12 05:00:43

裝飾器代碼功能

2013-05-17 09:41:02

Node.js云應用開發IaaS

2023-04-02 14:09:51

2022-06-16 10:37:09

asyncawait

2012-03-06 11:25:40

ibmdw
點贊
收藏

51CTO技術棧公眾號

秋霞影院一区二区| 日本午夜在线| 国产精品对白久久久久粗| 欧美色电影在线| 91av俱乐部| 夜夜精品视频| 国产精品免费电影| 高清久久一区| 日韩成人在线播放| 国产一级在线| 亚洲精品成人精品456| 国产又粗又猛又爽又黄的网站| 亚洲视频久久| 国产精品91一区| 嗯用力啊快一点好舒服小柔久久| 亚洲国语精品自产拍在线观看| 日韩资源在线| 亚洲韩国一区二区三区| 久久99999| 成人美女视频在线观看18| 开心色怡人综合网站| 欧美久久精品一级c片| 欧美激情精品在线 | 亚洲国产专区| 国产精品久久久久久久久久ktv| 24小时成人在线视频| 日韩精品福利网站| 男女羞羞视频在线观看| 欧美日韩精品高清| 黄色片免费在线| 亚洲mv在线观看| 东北一级毛片| 亚洲人吸女人奶水| 日韩大片一区二区| 国产亚洲欧美色| 久久婷婷国产精品| 久久综合色之久久综合| 欧美二区在线视频| 国产aⅴ精品一区二区三区色成熟| 亚洲韩国在线| 日本精品视频一区二区| 99在线欧洲视频| 草莓视频一区二区三区| 中文字幕精品网| 波多野结衣久久精品| 亚洲国产中文字幕在线观看| av大大超碰在线| 亚洲韩国青草视频| 99精品国自产在线| 欧美毛片免费观看| 中文字幕一区二区三区在线观看| 黄色视屏网站在线免费观看| 99久久影视| 亚洲人成电影网站色www| 亚洲国产精品久久久久婷婷老年 | 国产视频一区二| 亚洲黄色在线看| 国产丝袜在线播放| 亚洲人成电影网站色…| 欧美视频精品| 欧美成人精品xxx| 国产图片一区| 国产欧美一区二区| 一本久道综合久久精品| 亚洲精品国产精品国自产| 成人av网站在线观看| caoporen人人| 欧美揉bbbbb揉bbbbb| 国产精品一二三产区| 日韩亚洲第一页| 亚洲三级精品| 精品无人区一区二区三区竹菊| 蜜臀久久久99精品久久久久久| 国产精品又粗又长| 亚洲综合在线免费观看| 午夜老司机在线观看| 亚洲电影在线看| 亚洲福利影视| 国产成人啪精品视频免费网| 亚洲久久成人| 久久综合色视频| 高跟丝袜欧美一区| 草草在线观看| 国内精品视频一区| 亚洲欧洲一区| 久久精品网站视频| 欧美日韩精品一区二区| 先锋影音网一区二区| 国产精品久久久久久久久男| 日韩高清电影一区| 五月综合网站| 91精品欧美久久久久久动漫 | 狠狠色狠狠色综合日日小说| 欧美黑人猛交的在线视频| 欧美激情视频一区二区| 亚洲国产美女| 亚洲成人av免费看| 欧美日韩国产大片| 蜜桃精品视频| 国产伦精品一区二区三区照片| 成人av中文字幕| 九九九伊在人线综合| 中文字幕久久久| 欧美午夜a级限制福利片| 男人添女人下面高潮视频| 91搞黄在线观看| ady日本映画久久精品一区二区| 久久爱av电影| 国产精品狼人久久影院观看方式| 日韩激情av| 国产精品自产拍高潮在线观看| 老司机午夜精品| 自拍av在线| 日韩亚洲欧美中文高清在线| 久久久精品国产免大香伊| 日本aⅴ写真网站免费| 99re热这里只有精品免费视频| 国产一区高清| 亚洲在线不卡| 欧美日韩国产一级片| 欧美成人久久| 国产中文字幕在线观看| 亚洲一区二区| 国产午夜伦鲁鲁| 欧美日韩精品一区二区三区| 51vv免费精品视频一区二区| 亚洲欧美久久234| 色综合久久久久久久久| 亚洲一区二区三区在线免费| 久久99国产精品一区| 欧美三级欧美成人高清www| 一区二区三区高清在线观看| 男女啪啪的视频| 欧美一级二级三级蜜桃| 91久久电影| www.男人的天堂| 久久视频国产精品免费视频在线| 日本成人在线电影网| 蝌蚪视频在线播放| 欧美在线日韩在线| www久久精品| 久久99久久99精品免观看软件| 久久久久一区二区| 91精品91久久久中77777| 中文精品一区二区| 国产黄色特级片| 少妇高潮 亚洲精品| 精品中文字幕一区二区小辣椒 | 四虎永久国产精品| 欧美性videos高清精品| 久久91精品| 成人au免费视频影院| 色中色综合影院手机版在线观看| 国产精品亚洲а∨天堂免在线| heyzo高清在线| 亚洲不卡一卡2卡三卡4卡5卡精品| 欧美精品三级日韩久久| 黄色在线一区| 在线免费看黄| 美女三级99| 日韩色视频在线观看| 久久国产成人| 激情国产在线| 久久久久99精品成人片| 最近2019年日本中文免费字幕| 99久久99久久久精品齐齐| 9999精品| 手机在线免费观看毛片| 97福利一区二区| 亚洲午夜久久久久久久久电影院 | 香蕉视频在线网址| 亚洲精品久久久久中文字幕欢迎你 | 欧美精品成人网| 欧美高清视频在线播放| 国产精品国产三级国产有无不卡| youjizz亚洲| 日本激情视频网| 91久久精品www人人做人人爽 | 亚洲欧美经典视频| 欧美限制电影| 电影在线高清| 欧美一区二视频在线免费观看| 日韩av影片在线观看| 97se亚洲国产综合在线| 日韩极品少妇| 国产中文字幕在线| 一区二区三区观看| 九九久久国产精品| 亚洲综合图片区| 免费看电影在线| 欧美xxxx黑人又粗又长| 好看的中文字幕在线播放| 黄网在线观看| 国产乱子伦精品无码专区| 久久免费精品视频| 欧美一区二区三区喷汁尤物| 久草在线青青草| 综合av色偷偷网| 国产香蕉久久精品综合网| 国产精品成人a在线观看|