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