摘要:后面跟著的應(yīng)該是一個對象其他返回值也可以,只是會立即執(zhí)行捕獲錯誤參考文章函數(shù)的含義與用法
JavaScript異步流程控制的前世今生
javascript在設(shè)計之初.為了避免資源管理復雜問題(多個線程同時操作dom,以哪個為準),因此被設(shè)計成為了單線程語言.
說起異步就不得不提回調(diào), 為了解決多重回調(diào)嵌套導致代碼難以維護問題.javascript一直都在完善這個解決方案.
在10多年中javascript 異步流程控制經(jīng)過了
Callbackcallback -> event -> promise -> yield & co -> async await
ES6之前異步編程最常用的方法,如果回調(diào)函數(shù)嵌套層數(shù)較深,代碼將變得難以維護.并且在回調(diào)函數(shù)之外無法捕獲回調(diào)函數(shù)中的異常.
var fs = require("fs") try { fs.readFile("file", "utf8", function(err, data){ // if (err) { // console.log(err) // } else { console.log(data) // } }) } catch(e) { console.log(e) }
嘗試讀取一個不存在的文件時.外層的try/catch 無法捕獲這一異常.將輸出 undefine.
callback異步操作,異步調(diào)用的本體和callback屬于不同的事件循環(huán).而try/catch 只能捕獲當前事件的異常.因此將無法捕獲
采用事件驅(qū)動模式.任務(wù)的執(zhí)行不取決于代碼的順序,由某個事件來決定
var EventEmitter = require("events") var fs = require("fs") var eve = new EventEmitter() // 監(jiān)聽read事件 eve.on("read", function(value){ console.log(value) }) // 執(zhí)行一個異步讀取 fs.readFile("./template.txt", "utf8", function (err, data) { if (err) { console.log(err) } else { // 拿到數(shù)據(jù)后 發(fā)送一個read事件.并傳遞數(shù)據(jù) eve.emit("read", data) } })Promise
在ES6中提供了promise對象.給外界提供了統(tǒng)一的API.可用同步操作的流程來表達異步操作.避免了callback 中的嵌套層數(shù)過深,不便維護的弊端.
var fs = require("fs") function read (path) { return new Promise(function(resolve, reject){ fs.readFile(path, "utf8", function(err, data){ if (err) { reject(err) } else { console.log(data) resolve() } }) }) } read("./1.txt").then(function(){ return read("./2.txt") }).then(function(){ return read("./3.txt") }).then(function(){ console.log("執(zhí)行結(jié)束") })yield && co
通過Generator函數(shù)封裝異步任務(wù).在需要暫停的地方使用yield
var fs = require("fs") function *getData () { var a = yield readFile("./1.txt") console.log(a) var b = yield readFile("./2.txt") console.log(b) var c = yield readFile("./3.txt") console.log(c) } function readFile(path) { return new Promise(function(resolve, reject){ fs.readFile(path, "utf8", function (err, data) { if (err) { reject(err) } else { resolve(data) } }) }) } function co(gen) { var fn = gen() var lastVal return new Promise(function(resolve, reject){ !function next(lastVal) { var {value, done} = fn.next(lastVal) if (done) { resolve() } else { value.then(next, reject) } }() }) } co(getData)async/await
Async/Await應(yīng)該是目前最簡單的異步方案了
async 表示這是一個async函數(shù),await只能用在這個函數(shù)里面
await 表示在這里等待promise返回結(jié)果了,再繼續(xù)執(zhí)行。
await 后面跟著的應(yīng)該是一個promise對象(其他返回值也可以,只是會立即執(zhí)行)
捕獲錯誤
var fs = require("fs") async function getData () { try { var a = await readFile("file") } catch(e) { console.log(e) } var b = await readFile("./2.txt") console.log(b) var c = await readFile("./3.txt") console.log(c) } function readFile(path) { return new Promise(function(resolve, reject){ fs.readFile(path, "utf8", function (err, data) { if (err) { reject(err) } else { resolve(data) } }) }) } getData()
參考文章
Generator 函數(shù)的含義與用法
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/92574.html
摘要:協(xié)程的歷史說來話長,要從生成器開始講起。我們可以使用把數(shù)據(jù)發(fā)送給協(xié)程函數(shù)。可以看到,在第次接收完數(shù)據(jù)之后,會產(chǎn)生結(jié)束的異常,因為程序流程結(jié)束了,這是正常現(xiàn)象。在這個階段,協(xié)程本質(zhì)上還是由生成器構(gòu)成的。所以,協(xié)程的介紹到這里就結(jié)束啦。 在上一篇對python并發(fā)編程的理解 中,我簡單提到了協(xié)程的概念,有一個錯誤需要指出的是,asyncio不全是對協(xié)程的實現(xiàn),只是用到了協(xié)程。 協(xié)程的歷史說...
摘要:隨著越來越多的商業(yè)項目采用了和,可視化的概念也越來越深入人心。深知一款優(yōu)秀的編輯器工具,將大幅減少工程師和項目實施人員的工作量,就像編輯器在內(nèi)部使用時一樣。的發(fā)布,標志著已經(jīng)形成了內(nèi)部使用,客戶定制,標準化產(chǎn)品三位一體的編輯器解決方案。 插播一則廣告(長期有效) MONO哥需要在武漢招JavaScript工程師若干要求:對前端技術(shù)(JavasScript、HTML、CSS),對可視化技...
摘要:前言我是,如果你還不認識我,不妨先看看技術(shù)的前世今生一,以及技術(shù)的前世今生二前面我提過,我的大哥有一個叫的死黨,這家伙有事沒事經(jīng)常上我們家串門。時間來到了年,在那前后發(fā)生了兩件事讓我印象深刻。傳送門技術(shù)的前世今生一技術(shù)的前世今生二 前言:我是JavaScript,如果你還不認識我,不妨先看看《Web技術(shù)的前世今生(一)》,以及《Web技術(shù)的前世今生(二)》 前面我提過,我的大哥HTML...
摘要:前言我是,如果你還不認識我,不妨先看看技術(shù)的前世今生一平靜的生活已經(jīng)有一段日子了。傳送門技術(shù)的前世今生一技術(shù)的前世今生三 前言:我是JavaScript,如果你還不認識我,不妨先看看《Web技術(shù)的前世今生(一)》 平靜的生活已經(jīng)有一段日子了。 這一天,HTML大哥面露不悅地走過來問我: Js,你是打算和我們分家嗎? 大哥,您這說的哪里話,我什么地方做的不對么?我一臉茫然地回答道。 哼,...
摘要:前言我是,如果你還不認識我,不妨先看看技術(shù)的前世今生一平靜的生活已經(jīng)有一段日子了。傳送門技術(shù)的前世今生一技術(shù)的前世今生三 前言:我是JavaScript,如果你還不認識我,不妨先看看《Web技術(shù)的前世今生(一)》 平靜的生活已經(jīng)有一段日子了。 這一天,HTML大哥面露不悅地走過來問我: Js,你是打算和我們分家嗎? 大哥,您這說的哪里話,我什么地方做的不對么?我一臉茫然地回答道。 哼,...
閱讀 2335·2021-11-24 09:39
閱讀 3778·2021-11-19 09:40
閱讀 2152·2021-09-27 13:36
閱讀 1896·2019-08-30 15:44
閱讀 389·2019-08-30 13:52
閱讀 2711·2019-08-30 11:13
閱讀 2169·2019-08-29 16:18
閱讀 1754·2019-08-29 15:43