成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

dreambei / 1304人閱讀

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

相關(guān)文章

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

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

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

    摘要:不過讓流行起來的原因應(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í)行代碼...

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

    摘要:打開源碼,首先你會(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è)...

    Scorpion 評(píng)論0 收藏0
  • JavaScript的setTimeout和setInterval的深入理解

    摘要:所以其實(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和...

    cgh1999520 評(píng)論0 收藏0
  • JavaScript的setTimeout和setInterval的深入理解

    摘要:所以其實(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和...

    myeveryheart 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<