资讯专栏INFORMATION COLUMN

javascript中实现异步+遍历

dreambei / 1294人阅读

摘要:年月日更新后来在编程过程中发现用会更加方便。如果是没办法应对异步。重新调了一下,发现几点写下来异步操作这里的回调函数一定要写成这样的形式,如果使用的是这样的形式会指向这个匿名函数。

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

暂时没了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87053.html

相关文章

  • JavaScript 发布-订阅模式

    摘要:发布订阅模式订阅者把自己想订阅的事件注册到调度中心,当发布者发布该事件到调度中心,也就是该事件触发时,由调度中心统一调度订阅者注册到调度中心的处理代码。 发布-订阅模式,看似陌生,其实不然。工作中经常会用到,例如 Node.js EventEmitter 中的 on 和 emit 方法;Vue 中的 $on 和 $emit 方法。他们都使用了发布-订阅模式,让开发变得更加高效方便。 一...

    13651657101 评论0 收藏0
  • task0002(一)- JavaScript数据类型及语言基础

    摘要:不过让流行起来的原因应该是是目前所有主流浏览器上唯一支持的脚本语言。经过测试,数字字符串布尔日期可以直接赋值,修改不会产生影响。再考虑对象类型为或者的情况。对于结果声明其类型。判断对象的类型是还是,结果类型更改。 转载自我的个人博客 欢迎大家批评指正 1. 第一个页面交互 这里最需要学习的老师的代码中,每一部分功能都由函数控制,没有创建一个全部变量。且最后有一个函数来控制执行代码...

    elarity 评论0 收藏0
  • 自调用匿名函数(匿名闭包)解析与调用

    摘要:打开源码,首先你会看到这样的代码结构这是一个自调用匿名函数。模式,是自执行函数的高级模式,可以非常方便的在各个匿名闭包中以全局对象调用闭包函数。 打开jQuery源码,首先你会看到这样的代码结构: (function(window,undefined ){ // })(); 这是一个自调用匿名函数。什么东东呢?在第一个括号内,创建一个匿名函数;第二个括号,立即执行 为什么要创建这样一个...

    Scorpion 评论0 收藏0
  • JavaScript的setTimeout和setInterval的深入理解

    摘要:所以其实和所谓的异步调用事实上是通过将代码段插入到代码的执行队列中实现的。当执行和的时候,会根据你设定的时间准确地找到代码的插入点。综上所述,其实终归是单线程产物。无论如何异步都不可能突破单线程这个障碍。 发表过一片博客《跟着我用JavaScript写计时器》,比较基础.....有网友说应该写一下setTimeout的原理和机制,嗯,今天就来写一下吧: 直奔主题:setTimeout和...

    cgh1999520 评论0 收藏0
  • JavaScript的setTimeout和setInterval的深入理解

    摘要:所以其实和所谓的异步调用事实上是通过将代码段插入到代码的执行队列中实现的。当执行和的时候,会根据你设定的时间准确地找到代码的插入点。综上所述,其实终归是单线程产物。无论如何异步都不可能突破单线程这个障碍。 发表过一片博客《跟着我用JavaScript写计时器》,比较基础.....有网友说应该写一下setTimeout的原理和机制,嗯,今天就来写一下吧: 直奔主题:setTimeout和...

    myeveryheart 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<