摘要:年月日更新后來在編程過程中發(fā)現(xiàn)用會(huì)更加方便。如果是沒辦法應(yīng)對(duì)異步。重新調(diào)了一下,發(fā)現(xiàn)幾點(diǎn)寫下來異步操作這里的回調(diào)函數(shù)一定要寫成這樣的形式,如果使用的是這樣的形式會(huì)指向這個(gè)匿名函數(shù)。
2017年7月20日更新
后來在編程過程中發(fā)現(xiàn)用iterator會(huì)更加方便。在Array的iteration方法里面有這么一個(gè):Array.prototype[@@iterator]()。用法是`arr[Symbol.iterator](),比如像下面這樣:
var arr = [1,2,3,4,5,6] var eArr = arr[Symbol.iterator]() console.log(eArr)//Array Iterator {} console.log(eArr.next())//Object {value: 1, done: false}
eArr現(xiàn)在不再具有l(wèi)ength屬性,變成了一個(gè)iterator,每次調(diào)用next()method都會(huì)返回"下一個(gè)"元素,當(dāng)超出arr范圍的時(shí)候,value會(huì)是undefinde,而done屬性則成了true。說實(shí)話和判斷i==arr.length-1也沒什么太大的區(qū)別,不過我覺得寫成iterator更加好一點(diǎn)吧。下面的程序是我在mongoose里面批量存儲(chǔ)數(shù)據(jù)時(shí)候用到的。(看mongoose的文檔,insertMany命令雖然可以向model(相當(dāng)于db里面的collection)插入大量document,然而并不會(huì)進(jìn)行save。save的話果然還是要一個(gè)document一個(gè)document的來。如果把save當(dāng)做是異步操作那還是得異步與遍歷一起來,所以就有了下面的程序:(順便說一下,我發(fā)現(xiàn)批量數(shù)據(jù)存數(shù)據(jù)庫的時(shí)候,如果不用insertMany+遍歷save,而是用遍歷(insert+save)的話呢,會(huì)在mongod后臺(tái)報(bào)錯(cuò)topology error)
MultipleEntryInsertor.prototype.insertAll = function(data){ this.model1.insertMany(this.data,(err,docs)=>{ if(err)console.error(err) var eDocs = docs[Symbol.iterator]() var entry iter.call(this,eDocs) function iter(eDocs){ var entry = eDocs.next() if(!entry.done){ entry.value.save().then(arguments.callee.call(this,eDocs)) }else{ console.log("done"); this.dbList()//完成遍歷以后執(zhí)行的工作 } } }) }原文章
涉及文件讀取的時(shí)候經(jīng)常需要用到異步callback,最近寫到一個(gè)地方遇到了這么一個(gè)問題:
比如說現(xiàn)在我有一個(gè)數(shù)組:
var src = ["1.txt","2.txt","3.txt"]
現(xiàn)在我想用fs.readFile分別讀取三個(gè)文檔,然后把三個(gè)文檔的內(nèi)容經(jīng)過處理以后,合并成一個(gè)json數(shù)據(jù)輸出。如果是src.forEach(function(e){...})沒辦法應(yīng)對(duì)異步。
開始的時(shí)候我覺得既然異步涉及回調(diào),那應(yīng)該就是用遞歸就好了
實(shí)際上確實(shí)是用遞歸就可以了
//比如現(xiàn)在我要把a(bǔ)數(shù)組(比如上面的src)進(jìn)行一個(gè)異步的映射操作形成b數(shù)組: var src = ["1.txt","2.txt","3.txt"] var b = [] var asyncFunc=function (i,a,b){ fs.readFile(path.join(__dirname,"file",a[i]),"utf-8",(err,data)=>{ //異步完成以后進(jìn)行的映射操作: b.push(data) if(i==a.length-1){ console.log("done"); console.log(b); //這里是a數(shù)組已經(jīng)被遍歷完了,這時(shí)候?qū)數(shù)組進(jìn)行想要的操作 }else{ arguments.callee(i+1,a,b) } }) } asyncFunc(0,src,b)
以前遇到類似的問題的時(shí)候去stackOverFlow找過答案,不過沒看到合適的(或者當(dāng)時(shí)沒看到能看懂的),今天總算想通了這一塊,趕緊寫下來。
當(dāng)然了,這種寫法還是挺丑的,畢竟映射操作要寫在異步操作的回調(diào)函數(shù)里面,不過總算是能用。
重新調(diào)了一下,發(fā)現(xiàn)幾點(diǎn)寫下來:
fs.readFile(path.join(__dirname,"file",a[i]),"utf-8",(err,data)=>{...:異步操作這里的回調(diào)函數(shù)一定要寫成()=>{...}這樣的形式,如果使用的是function(err,data){...}這樣的形式arguments.callee會(huì)指向這個(gè)匿名函數(shù)。
暫時(shí)沒了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87053.html
摘要:發(fā)布訂閱模式訂閱者把自己想訂閱的事件注冊(cè)到調(diào)度中心,當(dāng)發(fā)布者發(fā)布該事件到調(diào)度中心,也就是該事件觸發(fā)時(shí),由調(diào)度中心統(tǒng)一調(diào)度訂閱者注冊(cè)到調(diào)度中心的處理代碼。 發(fā)布-訂閱模式,看似陌生,其實(shí)不然。工作中經(jīng)常會(huì)用到,例如 Node.js EventEmitter 中的 on 和 emit 方法;Vue 中的 $on 和 $emit 方法。他們都使用了發(fā)布-訂閱模式,讓開發(fā)變得更加高效方便。 一...
摘要:不過讓流行起來的原因應(yīng)該是是目前所有主流瀏覽器上唯一支持的腳本語言。經(jīng)過測(cè)試,數(shù)字字符串布爾日期可以直接賦值,修改不會(huì)產(chǎn)生影響。再考慮對(duì)象類型為或者的情況。對(duì)于結(jié)果聲明其類型。判斷對(duì)象的類型是還是,結(jié)果類型更改。 轉(zhuǎn)載自我的個(gè)人博客 歡迎大家批評(píng)指正 1. 第一個(gè)頁面交互 這里最需要學(xué)習(xí)的老師的代碼中,每一部分功能都由函數(shù)控制,沒有創(chuàng)建一個(gè)全部變量。且最后有一個(gè)函數(shù)來控制執(zhí)行代碼...
摘要:打開源碼,首先你會(huì)看到這樣的代碼結(jié)構(gòu)這是一個(gè)自調(diào)用匿名函數(shù)。模式,是自執(zhí)行函數(shù)的高級(jí)模式,可以非常方便的在各個(gè)匿名閉包中以全局對(duì)象調(diào)用閉包函數(shù)。 打開jQuery源碼,首先你會(huì)看到這樣的代碼結(jié)構(gòu): (function(window,undefined ){ // })(); 這是一個(gè)自調(diào)用匿名函數(shù)。什么東東呢?在第一個(gè)括號(hào)內(nèi),創(chuàng)建一個(gè)匿名函數(shù);第二個(gè)括號(hào),立即執(zhí)行 為什么要?jiǎng)?chuàng)建這樣一個(gè)...
摘要:所以其實(shí)和所謂的異步調(diào)用事實(shí)上是通過將代碼段插入到代碼的執(zhí)行隊(duì)列中實(shí)現(xiàn)的。當(dāng)執(zhí)行和的時(shí)候,會(huì)根據(jù)你設(shè)定的時(shí)間準(zhǔn)確地找到代碼的插入點(diǎn)。綜上所述,其實(shí)終歸是單線程產(chǎn)物。無論如何異步都不可能突破單線程這個(gè)障礙。 發(fā)表過一片博客《跟著我用JavaScript寫計(jì)時(shí)器》,比較基礎(chǔ).....有網(wǎng)友說應(yīng)該寫一下setTimeout的原理和機(jī)制,嗯,今天就來寫一下吧: 直奔主題:setTimeout和...
摘要:所以其實(shí)和所謂的異步調(diào)用事實(shí)上是通過將代碼段插入到代碼的執(zhí)行隊(duì)列中實(shí)現(xiàn)的。當(dāng)執(zhí)行和的時(shí)候,會(huì)根據(jù)你設(shè)定的時(shí)間準(zhǔn)確地找到代碼的插入點(diǎn)。綜上所述,其實(shí)終歸是單線程產(chǎn)物。無論如何異步都不可能突破單線程這個(gè)障礙。 發(fā)表過一片博客《跟著我用JavaScript寫計(jì)時(shí)器》,比較基礎(chǔ).....有網(wǎng)友說應(yīng)該寫一下setTimeout的原理和機(jī)制,嗯,今天就來寫一下吧: 直奔主題:setTimeout和...
閱讀 1670·2021-11-23 10:07
閱讀 2667·2019-08-30 11:10
閱讀 2850·2019-08-29 17:08
閱讀 1792·2019-08-29 15:42
閱讀 3188·2019-08-29 12:57
閱讀 2406·2019-08-28 18:06
閱讀 3555·2019-08-27 10:56
閱讀 394·2019-08-26 11:33