欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js異步之a(chǎn)sync和await實現(xiàn)同步寫法

 更新時間:2022年03月02日 11:47:58   作者:一天前  
本文主要介紹了js異步之a(chǎn)sync和await實現(xiàn)同步寫法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

首先我們假設(shè)有一方法 readFile 可以讀取文件內(nèi)容,  但是它是異步的。

var gen = function* (){
? ? var a = yield readFile('./a.txt');
? ? console.log(a.toString());
? ? var b = yield readFile('./b.txt');
? ? console.log(b.toString());
};

首先我們看下上面的代碼,如果我們將function 后面的 * 改成 async,將yield 改成 await,也就是下面的代碼

var gen = function async (){
? ? var a = await readFile('./a.txt');
? ? console.log(a.toString());
? ? var b = await readFile('./b.txt');
? ? console.log(b.toString());
};

是不是就是我們想要的同步寫異步操作了,第一種寫法就是 es6 中新支持的特性,Generator 函數(shù),那什么是 Generator 函數(shù)呢,簡單來說Generator 函數(shù)有多種理解角度。語法上,首先可以把它理解成,Generator 函數(shù)是一個狀態(tài)機,封裝了多個內(nèi)部狀態(tài)。執(zhí)行 Generator 函數(shù)會返回一個遍歷器對象,也就是說,Generator 函數(shù)除了狀態(tài)機,還是一個遍歷器對象生成函數(shù)。返回的遍歷器對象,可以依次遍歷 Generator 函數(shù)內(nèi)部的每一個狀態(tài)。上面的官方解釋看不懂沒關(guān)系。我們下面用例子演示下。

function* func(){?
? ? console.log("one");?
? ? yield '1';?
? ? console.log("two");?
? ? yield '2';?
? ? console.log("three");?
? ? return '3';?
}
var f = func();
f.next(); // one // {value: "1", done: false}?
f.next(); // two // {value: "2", done: false}?
f.next(); // three // {value: "3", done: true}?
f.next(); // {value: undefined, done: true}

上面的代碼我們第一次調(diào)用 f.next() 時,函數(shù) func 開始執(zhí)行,并在執(zhí)行到第一個 yield 時停住,并返回 yield 后面表達式的值,格式就是 {value: "1", done: false}  這種格式,value就是 yield 表達式的值
done 表示func函數(shù)是否執(zhí)行完畢,此時如果我們?nèi)绻又{(diào)用 f.next(),類推將返回第二 yield 后面表達式的值,也就是 {value: "2", done: false}。我們可以繼續(xù)調(diào)用 f.next() 直至 done 變成 true, 它表示func函數(shù)執(zhí)行完了。

function* func(){
? ? var a = yield '1';
? ? console.log(a);
? ? var b = yield '2';
? ? console.log(b);
}
var f = func();
f.next();?
f.next('1');?

f.next('2');我們繼續(xù)改造 func 函數(shù)為上面這種,在 next 分別傳入 1 和 2,我們會發(fā)現(xiàn) console.log(a) 打印 1 ,console.log(b) 打印 2,也就是我們可以傳值到 Generator 函數(shù)中。
現(xiàn)在我們回到下面這段代碼上面來,然后重新設(shè)計下,并實現(xiàn)  readFile 函數(shù)。

var gen = function* (){
? ? var a = yield readFile('./a.txt');
? ? console.log(a.toString());
? ? var b = yield readFile('./b.txt');
? ? console.log(b.toString());
};

var readFile = function (fileName){
? ? return new Promise((resolve)=>{
? ? ? ? fs.readFile(fileName, (err, data)=>{
? ? ? ? ? ? resolve(data);
? ? ? ? })
? ? });
};

function run(fn) {
? ? var gen = fn();
? ? function next(data) {
? ? ? ? var result = gen.next(data);
? ? ? ? if (result.done) return;
? ? ? ? result.value.then((data)=>{
? ? ? ? ? ? next(data);
? ? ? ? })
? ? }
? ? next();
}

run(gen);

看上面的代碼我們用 promise  實現(xiàn)  readFile 函數(shù),此時我們 yield 的返回值就是一個 promise 對象了,我們就可以使用, result.value.then((data)=>{next(data);})將 yield 返回的 value 值重新傳回 Generator 函數(shù),這樣我們的 console.log(a.toString()); 就可以獲取到 a.txt 文件中的內(nèi)容了, if (result.done) return; 可以用了判斷 Generator 函數(shù) 是否已執(zhí)行完畢,用來結(jié)束循環(huán)調(diào)用。所以如果我們單獨去看 gen 函數(shù),是不是就是將異步操作寫成同步語法了,如果我們將function 后面的 * 改成 async,將yield 改成 await也就是我們常用語法了。

到此這篇關(guān)于js異步之a(chǎn)sync和await實現(xiàn)同步寫法的文章就介紹到這了,更多相關(guān)js async和await同步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript面向?qū)ο蟪绦蛟O(shè)計中對象的定義和繼承詳解

    JavaScript面向?qū)ο蟪绦蛟O(shè)計中對象的定義和繼承詳解

    這篇文章主要介紹了JavaScript面向?qū)ο蟪绦蛟O(shè)計中對象的定義和繼承,結(jié)合實例形式詳細(xì)分析了javascript面向?qū)ο蟪绦蛟O(shè)計中對象定義、繼承、屬性、方法、深拷貝等相關(guān)概念與操作技巧,需要的朋友可以參考下
    2019-07-07
  • JS實現(xiàn)時間選擇器

    JS實現(xiàn)時間選擇器

    這篇文章主要為大家詳細(xì)介紹了JS實現(xiàn)時間選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 解決JS浮點數(shù)運算出現(xiàn)Bug的方法

    解決JS浮點數(shù)運算出現(xiàn)Bug的方法

    解決JS浮點數(shù)運算出現(xiàn)Bug的方法,需要的朋友可以參考一下
    2013-03-03
  • easyui tree帶checkbox實現(xiàn)單選的簡單實例

    easyui tree帶checkbox實現(xiàn)單選的簡單實例

    下面小編就為大家?guī)硪黄猠asyui tree帶checkbox實現(xiàn)單選的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • javascript實現(xiàn)畫板功能

    javascript實現(xiàn)畫板功能

    這篇文章主要為大家詳細(xì)介紹了javascript實現(xiàn)畫板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 小程序從零入手之WXSS模版語法匯總

    小程序從零入手之WXSS模版語法匯總

    wxss樣式語法包括rpx尺寸單位,樣式導(dǎo)入,全局與局部樣式,常用的樣式屬性,包括尺寸、邊框、邊距、文本、顏色等等,下面這篇文章主要給大家介紹了關(guān)于小程序從零入手之WXSS模版語法匯總的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • director.js實現(xiàn)前端路由使用實例

    director.js實現(xiàn)前端路由使用實例

    這篇文章主要介紹了director.js實現(xiàn)前端路由使用實例,director.js是最純粹的路由注冊/解析器,它在不刷新頁面的情況下,利用“#”符號組織不同的URL路徑,需要的朋友可以參考下
    2015-02-02
  • JS+JSP通過img標(biāo)簽調(diào)用實現(xiàn)靜態(tài)頁面訪問次數(shù)統(tǒng)計的方法

    JS+JSP通過img標(biāo)簽調(diào)用實現(xiàn)靜態(tài)頁面訪問次數(shù)統(tǒng)計的方法

    這篇文章主要介紹了JS+JSP通過img標(biāo)簽調(diào)用實現(xiàn)靜態(tài)頁面訪問次數(shù)統(tǒng)計的方法,基于JavaScript動態(tài)調(diào)用jsp頁面通過對TXT文本文件的讀寫實現(xiàn)統(tǒng)計訪問次數(shù)的功能,需要的朋友可以參考下
    2015-12-12
  • 基于HTML5上使用iScroll實現(xiàn)下拉刷新,上拉加載更多

    基于HTML5上使用iScroll實現(xiàn)下拉刷新,上拉加載更多

    本文主要介紹在HTML5中使用iScroll實現(xiàn)下拉刷新,上拉加載更多數(shù)據(jù)的方法,主要就是寫了兩個自定義函數(shù)pullDownAction和pullUpAction,分別在下拉和上拉的事件中調(diào)用他們。
    2016-05-05
  • 圖片上傳插件jquery.uploadify詳解

    圖片上傳插件jquery.uploadify詳解

    如果頁面沒有顯示“BROWSE”按鈕,則說明你的'uploader' : '<%=basePath%>images/uploadify.swf'配置不對,檢查下路徑是否正確
    2013-11-11

最新評論