国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

深入理解js 中async 函數(shù)的含義和用法

2024-05-06 15:34:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、終極解決

異步操作是 JavaScript 編程的麻煩事,麻煩到一直有人提出各種各樣的方案,試圖解決這個(gè)問(wèn)題。

從最早的回調(diào)函數(shù),到 Promise 對(duì)象,再到 Generator 函數(shù),每次都有所改進(jìn),但又讓人覺(jué)得不徹底。它們都有額外的復(fù)雜性,都需要理解抽象的底層運(yùn)行機(jī)制。

異步I/O不就是讀取一個(gè)文件嗎,干嘛要搞得這么復(fù)雜?異步編程的最高境界,就是根本不用關(guān)心它是不是異步。

async 函數(shù)就是隧道盡頭的亮光,很多人認(rèn)為它是異步操作的終極解決方案。

二、async 函數(shù)是什么?

一句話,async 函數(shù)就是 Generator 函數(shù)的語(yǔ)法糖。

前文有一個(gè) Generator 函數(shù),依次讀取兩個(gè)文件。

var fs = require('fs');var readFile = function (fileName){ return new Promise(function (resolve, reject){  fs.readFile(fileName, function(error, data){   if (error) reject(error);   resolve(data);  }); });};var gen = function* (){ var f1 = yield readFile('/etc/fstab'); var f2 = yield readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString());};

寫(xiě)成 async 函數(shù),就是下面這樣。

var asyncReadFile = async function (){ var f1 = await readFile('/etc/fstab'); var f2 = await readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString());};

一比較就會(huì)發(fā)現(xiàn),async 函數(shù)就是將 Generator 函數(shù)的星號(hào)(*)替換成 async,將 yield 替換成 await,僅此而已。

三、async 函數(shù)的優(yōu)點(diǎn)

async 函數(shù)對(duì) Generator 函數(shù)的改進(jìn),體現(xiàn)在以下三點(diǎn)。

(1)內(nèi)置執(zhí)行器。 Generator 函數(shù)的執(zhí)行必須靠執(zhí)行器,所以才有了 co 函數(shù)庫(kù),而 async 函數(shù)自帶執(zhí)行器。也就是說(shuō),async 函數(shù)的執(zhí)行,與普通函數(shù)一模一樣,只要一行。

var result = asyncReadFile();

(2)更好的語(yǔ)義。 async 和 await,比起星號(hào)和 yield,語(yǔ)義更清楚了。async 表示函數(shù)里有異步操作,await 表示緊跟在后面的表達(dá)式需要等待結(jié)果。

(3)更廣的適用性。 co 函數(shù)庫(kù)約定,yield 命令后面只能是 Thunk 函數(shù)或 Promise 對(duì)象,而 async 函數(shù)的 await 命令后面,可以跟 Promise 對(duì)象和原始類型的值(數(shù)值、字符串和布爾值,但這時(shí)等同于同步操作)。

四、async 函數(shù)的實(shí)現(xiàn)

async 函數(shù)的實(shí)現(xiàn),就是將 Generator 函數(shù)和自動(dòng)執(zhí)行器,包裝在一個(gè)函數(shù)里。

async function fn(args){ // ...}// 等同于function fn(args){  return spawn(function*() {  // ... }); }

所有的 async 函數(shù)都可以寫(xiě)成上面的第二種形式,其中的 spawn 函數(shù)就是自動(dòng)執(zhí)行器。

下面給出 spawn 函數(shù)的實(shí)現(xiàn),基本就是前文自動(dòng)執(zhí)行器的翻版。

function spawn(genF) { return new Promise(function(resolve, reject) {  var gen = genF();  function step(nextF) {   try {    var next = nextF();   } catch(e) {    return reject(e);    }   if(next.done) {    return resolve(next.value);   }    Promise.resolve(next.value).then(function(v) {    step(function() { return gen.next(v); });      }, function(e) {    step(function() { return gen.throw(e); });   });  }  step(function() { return gen.next(undefined); }); });}            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 普安县| 施甸县| 灵台县| 汤阴县| 全南县| 通化县| 毕节市| 巫山县| 旬阳县| 革吉县| 丰宁| 南昌县| 河间市| 交城县| 大连市| 罗田县| 宜兰县| 临海市| 嘉荫县| 宿迁市| 儋州市| 道孚县| 固始县| 栾城县| 兴业县| 即墨市| 桂阳县| 灯塔市| 临城县| 崇文区| 商河县| 阜平县| 龙胜| 牟定县| 张掖市| 玉环县| 偏关县| 綦江县| 洪江市| 嘉峪关市| 牡丹江市|