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