中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

在Node.js中使用Javascript Generators詳解
來源:易賢網(wǎng) 閱讀:1046 次 日期:2016-07-02 13:54:59
溫馨提示:易賢網(wǎng)小編為您整理了“在Node.js中使用Javascript Generators詳解”,方便廣大網(wǎng)友查閱!

下面小編就為大家?guī)硪黄贜ode.js中使用Javascript Generators詳解。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考

Generators是Javascript的一種協(xié)同程序( coroutine 簡稱:協(xié)程)風(fēng)格,是指那些可以在執(zhí)行時(shí)暫停然后又恢復(fù)的函數(shù),該函數(shù)是在functi配以星號符號形式如function* ,函數(shù)內(nèi)有些特征關(guān)鍵詞如yield 和yield*。

function* generatorFn () {

 console.log('look ma I was suspended')

}

var generator = generatorFn() // [1]

setTimeout(function () {

 generator.next() // [2]

}, 2000)

對代碼中標(biāo)注的[1]和[2]解釋如下:

1. 這是一個(gè)generator以暫停方式開始. 這時(shí)沒有控制臺輸出。

2.通過調(diào)用其next()方法,這個(gè)generator才會執(zhí)行,運(yùn)行直至它碰到下一個(gè)yield關(guān)鍵詞或return,現(xiàn)在我們就有了控制臺輸出。

再看一個(gè)案例:

function *generator() {

 console.log('Start!');

 var i = 0;

 while (true) {

  if (i < 3)

   yield i++;

 }

}

var gen = generator();

以上這段代碼類似第一個(gè),只是在generator函數(shù)中多了yield關(guān)鍵詞,以上這段代碼被調(diào)用時(shí),不會立即執(zhí)行,而是暫停待命的狀態(tài),因此不會有Start輸出。直到其next()調(diào)用才執(zhí)行。

var ret = gen.next();

// Start!

console.log(ret);

// {value: 0, done: false}

上面ret是generator結(jié)果. 它有兩個(gè)屬性:

■value, 在generator函數(shù)中的yield值,

■done, 這是一個(gè)標(biāo)識表示generator函數(shù)是否返回.

繼續(xù)代碼如下:

console.log(gen.next());

// {value: 1, done: false}

console.log(gen.next());

// {value: 2, done: false}

console.log(gen.next());

// {value: undefined, done: true}

generator在同步編程中沒有什么玄機(jī),特別適合在異步編程中。

generator有兩個(gè)特點(diǎn):

1.能選擇跳出一個(gè)函數(shù),讓外部代碼決定什么時(shí)候再跳回這個(gè)函數(shù)繼續(xù)執(zhí)行。

2.能夠進(jìn)行異步控制。

看下面異步執(zhí)行代碼:

var gen = generator();

console.log(gen.next().value);

setTimeout(function() {

 console.log(gen.next().value);

 console.log('第一步');

}, 1000);

console.log('第二步');

輸出是:

0

第二步

1

第一步

也就是說,不會在setTimeout這里等待計(jì)時(shí)結(jié)束,而是直接繼續(xù)“第二步”,不會在setTimeout堵塞。

再看另外一段代碼:

function* channel () {

 var name = yield 'hello, what is your name?' // [1]

 return 'well hi there ' + name

}

var gen = channel()

console.log(gen.next().value) // hello, what is your name? [2]

console.log(gen.next('billy')) // well hi there billy [3]

在遍歷時(shí)也可以使用*:

function* iter () {

 for (var i = 0; i < 10; i++) yield i

}

for (var val of iter()) {

 console.log(val) // outputs 1?—?9

}

普遍的誤解

既然我可以暫停一個(gè)函數(shù)執(zhí)行,那么是不是讓它們并行執(zhí)行呢?不是,因?yàn)镴avascript是一個(gè)單線程,如果你想尋求提升性能,generator并不是你的菜。

比如下面代碼分別執(zhí)行斐波那契數(shù):

function fib (n) {

 var current = 0, next = 1, swap

 for (var i = 0; i < n; i++) {

  swap = current, current = next

  next = swap + next

 }

 return current

}

function* fibGen (n) {

 var current = 0, next = 1, swap

 for (var i = 0; i < n; i++) {

  swap = current, current = next

  next = swap + next

  yield current

 }

}

性能結(jié)果如下:(越高越好)

results: 

regular 1263899 

generator 37541

generators閃亮點(diǎn)

Generators 能簡化JavaScript中函數(shù)的復(fù)雜性。

懶賦值

懶賦值雖然可以使用JS的閉包實(shí)現(xiàn),但是使用yield會有很大的簡化,通過暫停和恢復(fù),我們能夠在我們需要的時(shí)候獲取數(shù)值,比如上面fibGen函數(shù)可以在我們需要時(shí)拉取新值:

var fibIter = fibGen(20)

var next = fibIter.next()

console.log(next.value)

setTimeout(function () {

 var next = fibIter.next()

 console.log(next.value)

},2000)

當(dāng)然還使用for循環(huán):依然是懶賦值

for (var n of fibGen(20) {

 console.log(n)

}

無限序列

因?yàn)榭梢詰匈x值,那么可能表演一些Haskell招數(shù), 類似infinite sequences. 這里能夠yield一個(gè)無限序列的數(shù)量。

function* fibGen () {

 var current = 0, next = 1, swap

 while (true) {

  swap = current, current = next

  next = swap + next

  yield current

 }

}

我們看看一個(gè)斐波那契數(shù)流的懶賦值,要求它返回5000以后的第一個(gè)斐波那契數(shù):

for (var num of fibGen()) {

 if (num > 5000) break

}

console.log(num) // 6765

異步流程控制

使用generators實(shí)現(xiàn)異步流程控制,最常見是各種 promise庫包,那么它是如何工作呢?

在Node領(lǐng)域,每個(gè)事情都是和回調(diào)有關(guān),這是我們的低層次異步功能,我們可以使用generators 建立一個(gè)通訊通道,從而使用同步編程的風(fēng)格編寫異步代碼。

run(function* () {

 console.log("Starting")

 var file = yield readFile("./async.js") // [1]

 console.log(file.toString())

})

注釋1表示程序會在等待async.js返回結(jié)果以后再繼續(xù)。

genify是一個(gè)將generators帶入平常編程環(huán)境的框架,使用如下:

npm install genify 進(jìn)行安裝,代碼如下:

var Q = require('q');

var fs = require('fs');

var genify = require('genify');

// wrap your object into genify function

var object = genify({

 concatFiles: function * (file1, file2, outFile) {

  file1 = yield Q.nfcall(fs.readFile, file1);

  file2 = yield Q.nfcall(fs.readFile, file2);

  var concated = file1 + file2;

  yield Q.nfcall(fs.writeFile, outFile, concated);

  return concated;

 }

});

// concatFiles是一個(gè)generator函數(shù),它使用generator強(qiáng)大能力。

object.concatFiles('./somefile1.txt', './somefile2.txt', './concated.txt').then(function (res) {

 // do something with result

}, function (err) {

 // do something with error

});

以上這篇在Node.js中使用Javascript Generators詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:在Node.js中使用Javascript Generators詳解
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報(bào)班

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲免费在线观看| 亚洲欧美日韩区| 玖玖精品视频| 亚洲欧美在线看| 亚洲图片在区色| 一区二区冒白浆视频| 国内精品模特av私拍在线观看| 欧美日韩在线播放三区四区| 欧美成人精品一区| 免费国产自线拍一欧美视频| 久久久精品五月天| 一区二区高清在线| 亚洲国产一区二区a毛片| 激情欧美日韩| 亚洲第一精品福利| 亚洲精品久久久久久下一站 | 最新国产精品拍自在线播放| 国产欧美一区二区三区在线老狼 | 欧美日韩在线视频一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲美女福利视频网站| 国产女人精品视频| 国产日韩欧美综合一区| 国产亚洲人成网站在线观看| 国内精品久久久久久久影视麻豆 | 精品91视频| 亚洲丰满在线| 亚洲欧美网站| 男女av一区三区二区色多| 欧美美女日韩| 欧美一级淫片aaaaaaa视频| 久久久久久久一区二区三区| 久久免费午夜影院| 欧美视频一区二区三区| 亚洲国产片色| 久久精品视频在线观看| 欧美日在线观看| 欧美性天天影院| 亚洲人成毛片在线播放| 久久嫩草精品久久久精品| 欧美人成在线| 一区二区电影免费观看| 欧美国产成人精品| 国产亚洲精品bt天堂精选| 国产欧美视频在线观看| 亚洲视频播放| 国产精品扒开腿爽爽爽视频| 欧美成人蜜桃| 99天天综合性| 你懂的国产精品永久在线| 欧美国产免费| 一区二区三区国产| 欧美日韩成人一区| 一区二区三区在线高清| 日韩午夜av电影| 欧美日韩另类丝袜其他| 亚洲电影免费| 久久精品中文字幕免费mv| 欧美午夜精品电影| 亚洲社区在线观看| 国产精品久久999| 欧美一二三区在线观看| 国产日韩欧美精品| 精品9999| 一区二区三区视频免费在线观看| 尤物精品在线| 美国三级日本三级久久99| 国产亚洲日本欧美韩国| 久久久久一区二区| 日韩视频免费看| 国内外成人在线| a4yy欧美一区二区三区| 欧美精品www| 久久午夜国产精品| 在线亚洲精品| 国产一区二区三区四区五区美女| 欧美激情一区二区三区蜜桃视频| 亚洲伊人观看| 日韩一级裸体免费视频| 国内精品免费在线观看| 国产精品亚洲综合| 国产精品va| 亚洲电影第1页| 亚洲国产你懂的| 国产午夜精品一区二区三区欧美 | 国产欧美一区二区精品婷婷| 久久精品欧洲| 亚洲欧美成人一区二区三区| 一区二区在线视频观看| 麻豆精品传媒视频| 午夜精品国产更新| 亚洲麻豆国产自偷在线| 亚洲激情视频网| 伊人影院久久| 最新国产拍偷乱拍精品| 亚洲国产精品久久久久久女王| 激情婷婷亚洲| 日韩亚洲不卡在线| 在线免费不卡视频| 亚洲欧洲日韩女同| 中日韩男男gay无套| 亚洲在线免费| 久久亚洲一区二区| 国产伦精品一区二区三区高清 | 亚洲午夜精品久久| 葵司免费一区二区三区四区五区| 欧美日韩一区二区在线观看| 国产免费成人av| 一区二区三区久久网| 久久黄色网页| 国产日本亚洲高清| 午夜免费久久久久| 国产日韩欧美高清免费| 亚洲一区二区欧美| 欧美午夜精品久久久久久人妖| 伊人影院久久| 久久综合伊人| 欧美三级在线视频| 这里是久久伊人| 国产精品人人做人人爽| 亚洲一区欧美一区| 国产欧美日韩在线视频| 狠狠狠色丁香婷婷综合激情| 欧美在线视频一区| 激情亚洲网站| 亚洲永久视频| 在线精品观看| 欧美日韩一区二| 香蕉久久精品日日躁夜夜躁| 欧美1区3d| 亚洲午夜在线视频| 在线观看的日韩av| 欧美天天在线| 噜噜噜91成人网| 99在线精品观看| 国内自拍视频一区二区三区| 欧美国产日产韩国视频| 亚洲无限av看| 亚洲国产激情| 国产一区二区三区四区在线观看| 老牛影视一区二区三区| 亚洲在线网站| 亚洲美女在线看| 激情亚洲网站| 国产欧美日韩另类一区| 欧美伦理影院| 久久综合中文| 久久婷婷综合激情| 欧美一区二区视频在线| 日韩视频永久免费观看| 在线电影国产精品| 亚洲黄色毛片| 狠狠色噜噜狠狠色综合久| 国产精品久久久久久久久久妞妞| 久久久噜噜噜久久久| 亚洲欧美日韩综合aⅴ视频| 99re在线精品| 99国产精品国产精品久久| 亚洲国产乱码最新视频| 136国产福利精品导航网址| 国产日韩av一区二区| 国产精品久久久一区麻豆最新章节| 欧美成人激情视频免费观看| 欧美成人在线免费视频| 欧美电影免费| 欧美日韩第一区| 欧美激情1区2区| 欧美人成在线视频| 国产精品女主播| 国产亚洲综合性久久久影院| 国内激情久久| 亚洲精品永久免费| 亚洲理论在线观看| 正在播放日韩| 亚洲欧美一区二区三区在线| 亚洲一本大道在线| 亚洲欧美日本日韩| 久久精品欧美| 欧美91视频| 国产欧美日韩激情| 尤物yw午夜国产精品视频明星| 国产性天天综合网| 亚洲精品国产精品乱码不99按摩| 日韩视频不卡中文| 亚洲一区二区三区高清| 久久综合九色综合久99| 欧美成人69| 国产精品久久激情| 国产精品毛片在线| 亚洲精品中文在线| 新片速递亚洲合集欧美合集| 久久成人人人人精品欧| 国产精品久久99| 激情综合网激情| 巨乳诱惑日韩免费av| 国产精品va在线| 国产一区在线看| av成人激情| 欧美日韩国产综合视频在线| 国产香蕉久久精品综合网|