亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

javascript中實現(xiàn)異步+遍歷

dreambei / 1348人閱讀

摘要:年月日更新后來在編程過程中發(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

相關(guān)文章

  • JavaScript 發(fā)布-訂閱模式

    摘要:發(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ā)變得更加高效方便。 一...

    13651657101 評論0 收藏0
  • task0002(一)- JavaScript數(shù)據(jù)類型及語言基礎(chǔ)

    摘要:不過讓流行起來的原因應(yīng)該是是目前所有主流瀏覽器上唯一支持的腳本語言。經(jīng)過測試,數(shù)字字符串布爾日期可以直接賦值,修改不會產(chǎn)生影響。再考慮對象類型為或者的情況。對于結(jié)果聲明其類型。判斷對象的類型是還是,結(jié)果類型更改。 轉(zhuǎn)載自我的個人博客 歡迎大家批評指正 1. 第一個頁面交互 這里最需要學習的老師的代碼中,每一部分功能都由函數(shù)控制,沒有創(chuàng)建一個全部變量。且最后有一個函數(shù)來控制執(zhí)行代碼...

    elarity 評論0 收藏0
  • 自調(diào)用匿名函數(shù)(匿名閉包)解析與調(diào)用

    摘要:打開源碼,首先你會看到這樣的代碼結(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)建這樣一個...

    Scorpion 評論0 收藏0
  • JavaScript的setTimeout和setInterval的深入理解

    摘要:所以其實和所謂的異步調(diào)用事實上是通過將代碼段插入到代碼的執(zhí)行隊列中實現(xiàn)的。當執(zhí)行和的時候,會根據(jù)你設(shè)定的時間準確地找到代碼的插入點。綜上所述,其實終歸是單線程產(chǎn)物。無論如何異步都不可能突破單線程這個障礙。 發(fā)表過一片博客《跟著我用JavaScript寫計時器》,比較基礎(chǔ).....有網(wǎng)友說應(yīng)該寫一下setTimeout的原理和機制,嗯,今天就來寫一下吧: 直奔主題:setTimeout和...

    cgh1999520 評論0 收藏0
  • JavaScript的setTimeout和setInterval的深入理解

    摘要:所以其實和所謂的異步調(diào)用事實上是通過將代碼段插入到代碼的執(zhí)行隊列中實現(xiàn)的。當執(zhí)行和的時候,會根據(jù)你設(shè)定的時間準確地找到代碼的插入點。綜上所述,其實終歸是單線程產(chǎn)物。無論如何異步都不可能突破單線程這個障礙。 發(fā)表過一片博客《跟著我用JavaScript寫計時器》,比較基礎(chǔ).....有網(wǎng)友說應(yīng)該寫一下setTimeout的原理和機制,嗯,今天就來寫一下吧: 直奔主題:setTimeout和...

    myeveryheart 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<