javascript中完成异步+遍历

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会指向这个匿名函数。

  • 临时没了

    原文作者:beneon
    原文地址: https://segmentfault.com/a/1190000009740657
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞