国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ES6模塊化與異步編程高級用法

這篇具有很好參考價值的文章主要介紹了ES6模塊化與異步編程高級用法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

ES6 模塊化

1、什么是 ES6 模塊化規(guī)范

2、在 node.js 中體驗 ES6 模塊化

3、ES6 模塊化的基本語法

Promise

1. 回調(diào)地獄

2、Promise 的基本概念

3、基于回調(diào)函數(shù)按順序讀取文件內(nèi)容

4.、基于 then-fs 讀取文件內(nèi)容

4.1 then-fs 的基本使用

4.2 .then() 方法的特性

4.3 基于 Promise 按順序讀取文件的內(nèi)容

4.4 通過 .catch 捕獲錯誤

4.5 Promise.all() 方法

4.6 Promise.race() 方法

5. 基于 Promise 封裝讀文件的方法

1 getFile 方法的基本定義

2 創(chuàng)建具體的異步操作

3 獲取 .then 的兩個實參

4 調(diào)用 resolve 和 reject 回調(diào)函數(shù)

async/await

1. 什么是 async/await

2. async/await 的基本使用

3. async/await 的使用注意事項

EventLoop

1. JavaScript 是單線程的語言

2. 同步任務(wù)和異步任務(wù)

3. 同步任務(wù)和異步任務(wù)的執(zhí)行過程

4. EventLoop 的基本概念

5. 結(jié)合 EventLoop 分析輸出的順序

宏任務(wù)和微任務(wù)

1. 什么是宏任務(wù)和微任務(wù)

2. 宏任務(wù)和微任務(wù)的執(zhí)行順序

API 接口案例

1. 案例需求

2. 主要的實現(xiàn)步驟

3. 搭建項目的基本結(jié)構(gòu)

4. 創(chuàng)建基本的服務(wù)器

5. 創(chuàng)建 db 數(shù)據(jù)庫操作模塊

6. 創(chuàng)建 user_ctrl 模塊

7. 創(chuàng)建 user_router 模塊

8. 導(dǎo)入并掛載路由模塊

9. 使用 try…catch 捕獲異常


ES6 模塊化

1、什么是 ES6 模塊化規(guī)范

ES6 模塊化規(guī)范 瀏覽器端 服務(wù)器端 通用的模塊化開發(fā)規(guī)范。它的出現(xiàn)極大的降低了前端開發(fā)者的模塊化學(xué) 習(xí)成本,開發(fā)者不需再額外學(xué)習(xí) AMD、CMD 或 CommonJS 等模塊化規(guī)范。
ES6 模塊化規(guī)范中定義:
  • ?每個 js 文件都是一個獨立的模塊
  • ?導(dǎo)入其它模塊成員使用 import 關(guān)鍵字
  • ?向外共享模塊成員使用 export 關(guān)鍵字

2、在 node.js 中體驗 ES6 模塊化

node.js 中 默認僅支持 CommonJS 模塊化規(guī)范 ,若想基于 node.js 體驗與學(xué)習(xí) ES6 的模塊化語法,可以按照
如下兩個步驟進行配置:
① 確保安裝了 v14.15.1 或更高版本的 node.js
② 在 package.json 的根節(jié)點中添加 "type": "module" 節(jié)點

3、ES6 模塊化的基本語法

ES6 的模塊化主要包含如下 3 種用法:
  1. ?默認導(dǎo)出默認導(dǎo)入
  2. ?按需導(dǎo)出按需導(dǎo)入
  3. ?直接導(dǎo)入執(zhí)行模塊中的代碼
默認導(dǎo)出的語法: export default 默認導(dǎo)出的成員
默認導(dǎo)入的語法: import 接收名稱 from ' 模塊標(biāo)識符 '
每個模塊中, 只允許使用唯一的一次 export default,否則會報錯!
默認導(dǎo)入時的 接收名稱 可以任意名稱, 只要是合法的成員名稱即可
按需導(dǎo)出的語法: export 按需導(dǎo)出的成員
按需導(dǎo)入的語法: import { s1 } from '模塊標(biāo)識符'

Promise

1. 回調(diào)地獄

多層回調(diào)函數(shù)的相互嵌套 ,就形成了 回調(diào)地獄
為了解決回調(diào)地獄的問題, ES6 (ECMAScript 2015)中新增了 Promise 的概念。

2、Promise 的基本概念

① Promise 是一個構(gòu)造函數(shù)
  • ?我們可以創(chuàng)建 Promise 的實例 const p = new Promise()
  • ?new 出來的 Promise 實例對象,代表一個異步操作
② Promise.prototype 上包含一個 .then() 方法
  • ?每一次 new Promise() 構(gòu)造函數(shù)得到的實例對象,
  • ?都可以通過原型鏈的方式訪問到 .then() 方法,例如 p.then()
③ .then() 方法用來預(yù)先指定成功和失敗的回調(diào)函數(shù)
  • ?p.then(成功的回調(diào)函數(shù),失敗的回調(diào)函數(shù))
  • ?p.then(result => { }, error => { })
  • ?調(diào)用 .then() 方法時,成功的回調(diào)函數(shù)是必選的、失敗的回調(diào)函數(shù)是可選的

3、基于回調(diào)函數(shù)按順序讀取文件內(nèi)容

4.、基于 then-fs 讀取文件內(nèi)容

由于 node.js 官方提供的 fs 模塊 僅支持 回調(diào)函數(shù)的方式 讀取文件, 不支持 Promise 的調(diào)用方式 。因此,需 要先運行如下的命令,安裝 then-fs 這個第三方包,從而支持我們基于 Promise 的方式讀取文件的內(nèi)容:
npm i then-fs

4.1 then-fs 的基本使用

調(diào)用 then-fs 提供的 readFile() 方法,可以異步地讀取文件的內(nèi)容, 它的返回值是 Promise 的實例對象 。因 此可以 調(diào)用 .then() 方法 為每個 Promise 異步操作指定 成功 失敗 之后的回調(diào)函數(shù)。
//通過默認導(dǎo)入

import thenFs from 'then-fs'

注意:上述的代碼 無法保證文件的讀取順序 ,需要做進一步的改進!

4.2 .then() 方法的特性

如果上一個 .then() 方法中 返回了一個新的 Promise 實例對象 ,則可以通過下一個 .then() 繼續(xù)進行處理。通 過 .then() 方法的 鏈?zhǔn)秸{(diào)用 ,就解決了回調(diào)地獄的問題。

4.3 基于 Promise 按順序讀取文件的內(nèi)容

Promise 支持鏈?zhǔn)秸{(diào)用 ,從而來解決回調(diào)地獄的問題。示例代碼如下:
import thenFs from 'then-fs'

thenFs
  .readFile('./files/1.txt', 'utf8')
  .then((r1) => {
    console.log(r1)
    return thenFs.readFile('./files/2.txt', 'utf8')
  })
  .then((r2) => {
    console.log(r2)
    return thenFs.readFile('./files/3.txt', 'utf8')
  })
  .then((r3) => {
    console.log(r3)
  })

4.4 通過 .catch 捕獲錯誤

.catch((err) => {
    console.log(err.message)
  })
如果不希望前面的錯誤導(dǎo)致后續(xù)的 .then 無法正常執(zhí)行,則 可以將 .catch 的調(diào)用提前

4.5 Promise.all() 方法

Promise.all() 方法會發(fā)起并行的 Promise 異步操作,等 所有的異步操作全部結(jié)束后 才會執(zhí)行下一步的 .then 操作(等待機制)。示例代碼如下
import thenFs from 'then-fs'

const promiseArr = [
  thenFs.readFile('./files/3.txt', 'utf8'),
  thenFs.readFile('./files/2.txt', 'utf8'),
  thenFs.readFile('./files/1.txt', 'utf8'),
]

Promise.all(promiseArr).then(result => {
  console.log(result)
})

4.6 Promise.race() 方法

Promise.race() 方法會發(fā)起并行的 Promise 異步操作, 只要任何一個異步操作完成,就立即執(zhí)行下一步的 .then 操作 (賽跑機制)。示例代碼如下:
Promise.race(promiseArr).then(result => {
  console.log(result)
})

5. 基于 Promise 封裝讀文件的方法

方法的封裝要求:
方法的名稱要定義為 getFile
方法接收一個 形參 fpath ,表示要讀取的文件的路徑
方法的 返回值 為 Promise 實例對象

1 getFile 方法的基本定義

function getFile(fpath) {
return new Promise
}

2 創(chuàng)建具體的異步操作

如果想要創(chuàng)建 具體的異步操作 ,則需要在 new Promise() 構(gòu)造函數(shù)期間, 傳遞一個 function 函數(shù) , 將具體的 異步操作定義到 function 函數(shù)內(nèi)部
function getFile(fpath) {
  return new Promise(function () {
    fs.readFile(fpath, 'utf8', (err, dataStr) => {
      
    })
  })
}

3 獲取 .then 的兩個實參

通過 .then() 指定的成功失敗的回調(diào)函數(shù),可以在 function 的形參中進行接收,

4 調(diào)用 resolve 和 reject 回調(diào)函數(shù)

Promise 異步操作的結(jié)果,可以調(diào)用 resolve reject 回調(diào)函數(shù)進行處理。

import fs from 'fs'

function getFile(fpath) {
  return new Promise(function (resolve, reject) {
    fs.readFile(fpath, 'utf8', (err, dataStr) => {
      if (err) return reject(err)
      resolve(dataStr)
    })
  })
}

getFile('./files/11.txt')
  .then((r1) => {
    console.log(r1)
  })
  .catch((err) => console.log(err.message))

async/await

1. 什么是 async/await

async/await ES8 (ECMAScript 2017)引入的新語法,用來 簡化 Promise 異步操作 。在 async/await 出現(xiàn)之前,開發(fā)者只能通過 鏈?zhǔn)?.then() 的方式 處理 Promise 異步操作。

2. async/await 的基本使用

import thenFs from 'then-fs'

async function getAllFile() {
  const r1 = await thenFs.readFile('./files/1.txt', 'utf8')
  console.log(r1)
}

getAllFile()

3. async/await 的使用注意事項

  1. 如果在 function 中使用了 await,則 function 必須被 async 修飾
  2. 在 async 方法中,第一個 await 之前的代碼會同步執(zhí)行,await 之后的代碼會異步執(zhí)行
    console.log('A')
    async function getAllFile() {
      console.log('B')
      const r1 = await thenFs.readFile('./files/1.txt', 'utf8')
      console.log(r1)
      const r2 = await thenFs.readFile('./files/2.txt', 'utf8')
      console.log(r2)
      const r3 = await thenFs.readFile('./files/3.txt', 'utf8')
      console.log(r3)
      console.log('D')
    }
    
    getAllFile()
    console.log('C')
    
    
    //輸出 結(jié)果 
     A  
    B
     111、、
    D
    

EventLoop

1. JavaScript 是單線程的語言

JavaScript 是一門單線程執(zhí)行的編程語言。也就是說,同一時間只能做一件事情。

單線程執(zhí)行任務(wù)隊列的問題:
如果 前一個任務(wù)非常耗時 ,則后續(xù)的任務(wù)就不得不一直等待,從而導(dǎo)致 程序假死 的問題。

2. 同步任務(wù)和異步任務(wù)

為了防止某個 耗時任務(wù) 導(dǎo)致 程序假死 的問題,JavaScript 把待執(zhí)行的任務(wù)分為了兩類:
同步任務(wù) (synchronous)
  • ?又叫做非耗時任務(wù),指的是在主線程上排隊執(zhí)行的那些任務(wù)
  • ?只有前一個任務(wù)執(zhí)行完畢,才能執(zhí)行后一個任務(wù)
異步任務(wù)(asynchronous)
  • ?又叫做耗時任務(wù),異步任務(wù)由 JavaScript 委托給宿主環(huán)境進行執(zhí)行
  • ?當(dāng)異步任務(wù)執(zhí)行完成后,會通知 JavaScript 主線程執(zhí)行異步任務(wù)的回調(diào)函數(shù)

3. 同步任務(wù)和異步任務(wù)的執(zhí)行過程

  1. ?同步任務(wù)由 JavaScript 主線程次序執(zhí)行
  2.  異步任務(wù)委托給宿主環(huán)境執(zhí)行
  3. ?已完成的異步任務(wù)對應(yīng)的回調(diào)函數(shù),會被 加入到任務(wù)隊列中等待執(zhí)行
  4. ?JavaScript 主線程的執(zhí)行棧被清空后,會 讀取任務(wù)隊列中的回調(diào)函數(shù),次序執(zhí)行
  5. ?JavaScript 主線程不斷重復(fù)上面的第 4 步

4. EventLoop 的基本概念

JavaScript 主線程從“任務(wù)隊列”中讀取異步 任務(wù)的回調(diào)函數(shù),放到執(zhí)行棧中依次執(zhí)行 。這 個過程是循環(huán)不斷的,所以整個的這種運行機 制又稱為 EventLoop (事件循環(huán))。

5. 結(jié)合 EventLoop 分析輸出的順序

同步任務(wù)。會根據(jù)代碼的先后順序依次被執(zhí)行

異步任務(wù) 。它們的回調(diào)函數(shù)會被加入到任務(wù)隊列中,等待主線程空閑時再執(zhí)行

宏任務(wù)和微任務(wù)

1. 什么是宏任務(wù)和微任務(wù)

JavaScript 把異步任務(wù)又做了進一步的劃分,異步任務(wù)又分為兩類,分別是:
① 宏任務(wù) (macrotask)
  • ?異步 Ajax 請求、
  • ?setTimeout、setInterval、
  • ?文件操作
  • ?其它宏任務(wù)
② 微任務(wù) (microtask)
  • ?Promise.then、.catch 和 .finally
  • ?process.nextTick
  • ?其它微任務(wù)

2. 宏任務(wù)和微任務(wù)的執(zhí)行順序

每一個宏任務(wù)執(zhí)行完之后,都會檢查 是否存在待執(zhí)行的微任務(wù) , 如果有,則執(zhí)行完所有微任務(wù)之后,再繼續(xù)執(zhí)行下一個宏任務(wù)。

API 接口案例

1. 案例需求

基于 MySQL 數(shù)據(jù)庫 + Express 對外提供 用戶列表 的 API 接口服務(wù)。用到的技術(shù)點如下:
  • ?第三方包 express 和 mysql2
  • ?ES6 模塊化
  • ?Promise
  • ?async/await

2. 主要的實現(xiàn)步驟

  1. ?搭建項目的基本結(jié)構(gòu)
  2. ?創(chuàng)建基本的服務(wù)器
  3. ?創(chuàng)建 db 數(shù)據(jù)庫操作模塊
  4. ?創(chuàng)建 user_ctrl 業(yè)務(wù)模塊
  5. ?創(chuàng)建 user_router 路由模塊

3. 搭建項目的基本結(jié)構(gòu)

創(chuàng)建一個文件目錄 用vscode打開?

初始包 npm? init -y?

① 啟用 ES6 模塊化支持
  • ?在 package.json 中聲明 "type": "module"
② 安裝第三方依賴包
  • ?運行 npm install express@4.17.1 mysql2@2.2.5

4. 創(chuàng)建基本的服務(wù)器

新建app.js

import express from 'express'

const app = express()


app.listen(80, () =>{
  console.log('serve run 127.0.0.1')
})

運行 nodemon app.js?

5. 創(chuàng)建 db 數(shù)據(jù)庫操作模塊

新建 db/index.js

數(shù)據(jù)庫中必須有數(shù)據(jù)

import mysql from 'mysql2'

const pool = mysql.createPool({
  host: '127.0.0.1',
  port: '3306',
  database: 'test',
  user: 'root',
  password: '123456',
})

export default pool.promise()

6. 創(chuàng)建 user_ctrl 模塊

新建?user_ctrl.js? ? ?運行 :node?user_ctrl.js?

import db from '../db/index.js'

export async function getAllUser(req, res){
  const [rows] = await db.query('select id, username, password from user' )
  console.log(rows)
  res.send({
    status: 0,
    message: '獲取用戶成功',
    data: rows,
  })
}

7. 創(chuàng)建 user_router 模塊

新建route /user_router.js?

import express from 'express'
import { getAllUser } from '../controller/user_ctrl.js'

const router = new express.Router()
router.get('/user', getAllUser)

export default router

8. 導(dǎo)入并掛載路由模塊

import express from 'express'
import userRouter  from './router/user_router.js'

const app = express()

app.use('/api', userRouter)

app.listen(80, () =>{
  console.log('serve run 127.0.0.1')
})

9. 使用 try…catch 捕獲異常

import db from '../db/index.js'

export async function getAllUser(req, res){
try {
  const [rows] = await db.query('select id, username, password from user' )
  console.log(rows)
  res.send({
    status: 0,
    message: '獲取用戶成功',
    data: rows,
  })
}catch(err){
  res.send({
    status: 1,
    message: '獲取用戶失敗',
    desc: err.message,
  })
}
}

運行 :nodemon app.js文章來源地址http://www.zghlxwxcb.cn/news/detail-604020.html

到了這里,關(guān)于ES6模塊化與異步編程高級用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • ES6之Promise、Class類與模塊化(Modules)

    ES6之Promise、Class類與模塊化(Modules)

    Promise 是 ES6 引入的一種用于 處理異步操作 的對象。 它解決了傳統(tǒng)回調(diào)函數(shù)(callback)模式中容易出現(xiàn)的 回調(diào)地獄 和代碼可讀性差的問題。 Promise 對象有三種狀態(tài): Pending (進行中): 初始化狀態(tài),表示異步操作還在進行中。 Fulfilled (已成功): 表示異步操作執(zhí)行成功,并

    2024年02月10日
    瀏覽(94)
  • ES6模塊化(默認導(dǎo)入導(dǎo)出、按需導(dǎo)入導(dǎo)出、直接導(dǎo)入)

    ES6模塊化(默認導(dǎo)入導(dǎo)出、按需導(dǎo)入導(dǎo)出、直接導(dǎo)入)

    一、介紹ES6模塊化 ? ? ES6 模塊化規(guī)范是瀏覽器端與服務(wù)器端通用的模塊化規(guī)范,ES6模塊化的出現(xiàn)前端開發(fā)者不再需要額外的學(xué)習(xí)其他的模塊化規(guī)范。 ?二、ES6 模塊化規(guī)范中定義: 1.每個 js 文件都是一個獨立的模塊 2.導(dǎo)入其它模塊成員使用 import 3.向外共享模塊成員使

    2024年02月09日
    瀏覽(101)
  • 【前端模塊化】JS模塊化思想以及相關(guān)規(guī)范(CommonJS、ES module)

    1.模塊化概念 隨著前端應(yīng)用日趨復(fù)雜,項目代碼也大量膨脹,模塊化就是一種最主流的代碼組織方式, 一個模塊就是一個實現(xiàn)特定功能的文件 ,它通過把我們的復(fù)雜代碼按照功能的不同,劃分為不同的模塊單獨維護的這種方式,去提高我們的開發(fā)效率,降低維護成本。要用

    2024年02月01日
    瀏覽(41)
  • JavaScript中的模塊化編程

    JavaScript是一種強大的編程語言,它可以在瀏覽器中進行客戶端腳本編寫,并且在服務(wù)器端也有廣泛的應(yīng)用。隨著JavaScript應(yīng)用的增多,JavaScript代碼的復(fù)雜度也不斷增加。為了提高代碼的可維護性和重用性,模塊化編程變得越來越重要。本文將討論JavaScript中的模塊化編程,包括

    2024年02月02日
    瀏覽(99)
  • C語言模塊化編程思維

    C語言模塊化編程思維

    eg1:代碼案例演示 1:程序的頭文件 2:程序邏輯函數(shù)文件(這里使用一個延時函數(shù)為例子) 3:程序的主文件控制函數(shù)的實現(xiàn) (main函數(shù)是c語言程序的入口一個c文件有且僅僅只能有一個main函數(shù)文件) 以上是編寫代碼的一種思路,要進一步掌握需要在實際的編程中鍛煉 c語言模

    2024年01月21日
    瀏覽(97)
  • WPF+Prism 模塊化編程(一)

    WPF+Prism 模塊化編程(一)

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 1、新建WPF項目,創(chuàng)建基于 .NET Framework 框架的應(yīng)用程序,項目名稱為 PrismModelDemo,創(chuàng)建步驟如下所示。 項目創(chuàng)建完成后,新建Views文件夾和ViewModels 文件夾,移動 MainWindow.xaml 至 Views文件下,在ViewModels文件中

    2024年04月09日
    瀏覽(103)
  • Flask 高級應(yīng)用:使用藍圖模塊化應(yīng)用和 JWT 實現(xiàn)安全認證

    本文將探討 Flask 的兩個高級特性:藍圖(Blueprints)和 JSON Web Token(JWT)認證。藍圖讓我們可以將應(yīng)用模塊化,以便更好地組織代碼;而 JWT 認證是現(xiàn)代 Web 應(yīng)用中常見的一種安全機制。 在大型應(yīng)用中,一個單獨的 Python 文件可能無法容納所有的路由和視圖函數(shù)。這時,F(xiàn)lask 的

    2024年02月13日
    瀏覽(31)
  • Python面向?qū)ο缶幊?,實現(xiàn)模塊化開發(fā)

    面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP)是一種編程范式,它將真實世界中的事物抽象成程序中的對象,并通過對象之間的相互作用來完成程序的邏輯。 封裝 (Encapsulation) 封裝是指把數(shù)據(jù)和行為結(jié)合成一個相對獨立的整體,防止程序中其他部分直接訪問或修改這個整體,而

    2024年02月05日
    瀏覽(95)
  • 基于Keil a51匯編 —— 模塊化編程

    許多程序太長或太復(fù)雜,無法作為一個單元編寫。當(dāng)代碼被劃分為小的功能單元時,編程變得更加簡單。模塊化程序通常比單片程序更容易編碼、調(diào)試和更改。 模塊化編程方法類似于包含大量電路的硬件設(shè)計。設(shè)備或程序在邏輯上分為具有特定輸入和輸出的“黑匣子”。一旦

    2024年02月07日
    瀏覽(19)
  • Node.js開發(fā)、CommondJS 、ES-Module模塊化設(shè)計

    Node.js開發(fā)、CommondJS 、ES-Module模塊化設(shè)計

    目錄 ?Node.js是什么 基礎(chǔ)使用 Node的REPL 全局變量 ?模塊化設(shè)計 CommondJS規(guī)范 ?基礎(chǔ)使用exports和module.exports require ?CommondJS優(yōu)缺點 AMD和CMD規(guī)范 ES_Module ?基本使用方法 導(dǎo)出 導(dǎo)入 ?結(jié)合使用 默認導(dǎo)出 ES Module解析流程 ?Node與瀏覽器的對比 ?在瀏覽器中,HTML與CSS交給Blink處理,如果其

    2023年04月21日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包