成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

理解通過thunk函數(shù)自動(dòng)執(zhí)行g(shù)enerator函數(shù)

int64 / 791人閱讀

摘要:總結(jié)執(zhí)行方法本質(zhì)上相當(dāng)于注冊一個(gè)回調(diào)函數(shù),而函數(shù)結(jié)合函數(shù)就是一種更直觀的注冊回調(diào)函數(shù)的方式。函數(shù)負(fù)責(zé)異步執(zhí)行交出執(zhí)行權(quán),而函數(shù)負(fù)責(zé)注冊回調(diào)返回執(zhí)行權(quán),執(zhí)行下一步,兩者結(jié)合從而自動(dòng)執(zhí)行函數(shù)。

今天又看了一遍阮一峰老師的《Thunk 函數(shù)的含義和用法》,這里整理一下自己的理解:

在 JavaScript 語言中,Thunk 函數(shù)替換的不是表達(dá)式,而是多參數(shù)函數(shù),將其替換成單參數(shù)的版本,且只接受回調(diào)函數(shù)作為參數(shù)。

// 正常版本的readFile(多參數(shù)版本)
fs.readFile(fileName, callback);

// Thunk版本的readFile(單參數(shù)版本)
var readFileThunk = Thunk(fileName);
readFileThunk(callback);

var Thunk = function (fileName){
  return function (callback){
    return fs.readFile(fileName, callback); 
  };
};

以讀取文件為例。下面的 Generator 函數(shù)封裝了兩個(gè)異步操作。

var fs = require("fs");
var thunkify = require("thunkify");
var readFile = thunkify(fs.readFile);

var gen = function* (){
  var r1 = yield readFile("/etc/fstab"); // 2. 讀取文件一
  console.log(r1.toString());
  var r2 = yield readFile("/etc/shells");// 5. 讀取文件二
  console.log(r2.toString());
};

手動(dòng)執(zhí)行方式:

var g = gen();// 0. 初始化

var r1 = g.next();// 1. 執(zhí)行下一步,返回的r1就是generator指針:{value, done},而這里的value其實(shí)就是一個(gè)thunk函數(shù),這個(gè)thunk函數(shù)以回調(diào)函數(shù)作為參數(shù)
r1.value(function(err, data){// 3. 文件一讀取完成的回調(diào)函數(shù)
  if (err) throw err;
  var r2 = g.next(data);// 4. 執(zhí)行下一步
  r2.value(function(err, data){ // 文件二讀取完成的回調(diào)函數(shù)
    if (err) throw err;
    g.next(data);
  });
});

總的來說,其實(shí)就是利用thunk函數(shù),把需要做的操作和對應(yīng)的回調(diào)函數(shù),從fn(operation, callback)改成了fn(operation)(callback)的形式。

為什么要這么做?
是因?yàn)間enerator函數(shù)在yield返回后,不會(huì)自動(dòng)往下執(zhí)行,如果寫成:

var gen = function* (){
  var r1 = yield readFile("/etc/fstab", gen.next()); // 這時(shí)gen還沒有初始化,不是一個(gè)generator指針,所以沒有next方法,而gen() !== gen(),所以也不能寫成gen().next()
  console.log(r1.toString());
};

也沒法自動(dòng)執(zhí)行,所以將回調(diào)函數(shù)分離到第二步,然后在回調(diào)函數(shù)里(這時(shí)generator肯定已經(jīng)初始化完了,不然沒法執(zhí)行到回調(diào)函數(shù))執(zhí)行g(shù)enerator指針的next方法,走到下一步。

總結(jié):執(zhí)行value方法本質(zhì)上相當(dāng)于注冊一個(gè)回調(diào)函數(shù),而generator函數(shù)結(jié)合thunk函數(shù)就是一種更直觀的注冊回調(diào)函數(shù)的方式。generator函數(shù)負(fù)責(zé)異步執(zhí)行(交出執(zhí)行權(quán)),而thunk函數(shù)負(fù)責(zé)注冊回調(diào)(返回執(zhí)行權(quán),執(zhí)行下一步),兩者結(jié)合從而自動(dòng)執(zhí)行g(shù)enerator函數(shù)。

如果有任何理解不妥當(dāng)?shù)牡胤剑瑲g迎指正交流。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89379.html

相關(guān)文章

  • 簡單理解Generator執(zhí)行及async、await語法原理

    摘要:為了更加方便的處理異步操作問題,現(xiàn)在最新的前端框架生態(tài)都開始用上了和,有的甚至已經(jīng)開始使用最新的語法了,這兩樣都是基于自動(dòng)執(zhí)行的原理。這里就簡單理解下自執(zhí)行及語法原理一函數(shù)函數(shù)指的是能將執(zhí)行結(jié)果傳入回調(diào)函數(shù),并將該回調(diào)函數(shù)返回的函數(shù)。 為了更加方便的處理異步操作問題,現(xiàn)在最新的前端框架生態(tài)都開始用上了Generator和yield,有的甚至已經(jīng)開始使用最新的async、await語法了...

    stackfing 評論0 收藏0
  • ES6&ES7中的異步之Generator函數(shù)與異步編程

    摘要:傳統(tǒng)的異步方法回調(diào)函數(shù)事件監(jiān)聽發(fā)布訂閱之前寫過一篇關(guān)于的文章,里邊寫過關(guān)于異步的一些概念。內(nèi)部函數(shù)就是的回調(diào)函數(shù),函數(shù)首先把函數(shù)的指針指向函數(shù)的下一步方法,如果沒有,就把函數(shù)傳給函數(shù)屬性,否則直接退出。 Generator函數(shù)與異步編程 因?yàn)閖s是單線程語言,所以需要異步編程的存在,要不效率太低會(huì)卡死。 傳統(tǒng)的異步方法 回調(diào)函數(shù) 事件監(jiān)聽 發(fā)布/訂閱 Promise 之前寫過一篇關(guān)...

    venmos 評論0 收藏0
  • 關(guān)于協(xié)程和 ES6 中的 Generator

    摘要:關(guān)于協(xié)程和中的什么是協(xié)程進(jìn)程和線程眾所周知,進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是工作時(shí)間段的描述,不過是顆粒大小不同,進(jìn)程是資源分配的最小單位,線程是調(diào)度的最小單位。子程序就是協(xié)程的一種特例。 關(guān)于協(xié)程和 ES6 中的 Generator 什么是協(xié)程? 進(jìn)程和線程 眾所周知,進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是CPU工作時(shí)間段的描述,不過是顆粒大小不同,進(jìn)程是 CPU 資源分配的最小單位,...

    RyanHoo 評論0 收藏0
  • Node.js 異步異聞錄

    摘要:的異步完成整個(gè)異步環(huán)節(jié)的有事件循環(huán)觀察者請求對象以及線程池。執(zhí)行回調(diào)組裝好請求對象送入線程池等待執(zhí)行,實(shí)際上是完成了異步的第一部分,回調(diào)通知是第二部分。異步編程是首個(gè)將異步大規(guī)模帶到應(yīng)用層面的平臺(tái)。 showImg(https://segmentfault.com/img/remote/1460000011303472); 本文首發(fā)在個(gè)人博客:http://muyunyun.cn/po...

    zzbo 評論0 收藏0
  • 再讀Generator和Co源碼

    摘要:沿用上面的例子,把包裝成一個(gè)對象這個(gè)回調(diào)就是等價(jià)于通過在里執(zhí)行回調(diào)函數(shù),獲取到上一步操作的結(jié)果和交回執(zhí)行權(quán),并把值傳遞回函數(shù)內(nèi)部,實(shí)現(xiàn)了遞歸執(zhí)行進(jìn)一步封裝,可以得到以下的代碼遞歸執(zhí)行 以前看過的內(nèi)容,感覺忘得差不多,最近抽空又看了一次,果然書讀百遍其義自見 Generator的執(zhí)行 Generator函數(shù)可以實(shí)現(xiàn)函數(shù)內(nèi)外的數(shù)據(jù)交換和執(zhí)行權(quán)交換。 從第一次調(diào)用next開始,從函數(shù)頭部開始...

    ernest.wang 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<