2018-07-11号,我来到了fs项目组担任后端开发的角色。这是我来thoughtworks以来首个的正式项目,不管是在技术还是在敏捷的实践中都是受益匪浅。来感受tw特殊的文化的同时,我希望自己能够学到更多的东西。不忘初心,坚持总结。这篇博客主要记载的是async/await在Array中使用遇到的一些问题。

一、async/await在Array.forEach中不work

我们想在forEach中执行操作再执行下面的操作,但是运行并没有生效。下面看一下forEach的事例

const waitFor = (ms) => new Promise(r => setTimeout(r, ms));
const start = async () => {
const array = [, , ];
array.forEach(async (item) => {
await waitFor(item);
console.log(item);
});
console.log('done');
}
start();

在nodejs(v10.6.0)中运行,可以看到如下的结果

done

原因的分析可以参考一下forEach的实现,这里暂时不做说明:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill。下面提供两种提供的方案

  • 不使用forEach,使用fori的循环,同步执行
const start = async () => {
const array = [, , ];
for (let i = ; i < array.length; i++) {
await waitFor(array[i]);
console.log(array[i]);
}
console.log('done');
}
  • 使用Promise.all和map的实现,异步执行
const start = async () => {
const array = [, , ];
await Promise.all(array.map(async num => {
await waitFor(num);
console.log(num);
}));
console.log('done');
}

最终得到我们想要的运行结果


done

二、async/await在Array.filter中不work

我们写一个js的例子,nodejs的版本是v10.6.0。代码如下

const filterOperate = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const start = async () => {
let array = [, , ];
array = array.filter(async (item) => {
await filterOperate(item);
return item === ;
});
console.log(array);
console.log('done');
}
start();

运行的结果并不是我们想要的,如下:

[ , ,  ]
done

我们需要改进filter,用我们定义的asyncFilter方法。定义如下:

const filterOperate = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const asyncFilter = async (arr, callback) => {
const fail = Symbol();
return (await Promise.all(arr.map(async item => (await callback(item)) ? item : fail))).filter(i => i !== fail);
};
const start = async () => {
let array = [, , ];
array = await asyncFilter(array, async (item) => {
await filterOperate(item);
return item == ;
})
console.log(array);
console.log('done');
}
start();

打印的结果如下:

[  ]
done

三、async/await在Array.map中不work

我们写一个js的例子,代码如下:

const promise = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const start = async () => {
let array = [, , ];
array = await array.map(async (item) => {
await promise(item);
return item * ;
})
console.log(array);
console.log('done');
}
start();

运行的结果如下:

[ Promise { <pending> },
Promise { <pending> },
Promise { <pending> } ]
done

我们改进代码,使它返回正确的结果。只要在外面包含一层Promise.all就可以。如下

const promise = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const start = async () => {
let array = [, , ];
array = await Promise.all(array.map(async item => {
await promise(item);
return item * ;
}));
console.log(array);
console.log('done');
}
start();

运行的结果如下:

[ , ,  ]
done

友情链接

fs项目---->async/await的学习(一)的更多相关文章

  1. fs项目---->cron框架的学习(一)

    Cron是一种允许您按计划执行某些内容的工具.这通常使用cron语法来完成.我们允许您在计划作业触发时执行函数.我们还允许您使用子进程执行javascript进程外部的作业.此外,这个库超出了基本的c ...

  2. javascript异步编程 Async/await

    Async/await Async/await 在学习他之前应当补充一定的 promise 知识 它是一种与 promise 相配合的特殊语法,目前被认为是异步编程的终级解决方案 值得我们每一个人学习 ...

  3. vue项目进行时,script标签中,methods事件中函数使用的async/await

    用 async/await 来处理异步 await关键字只能放到async函数里面,通过await得到就是Promise返回的内容:当然也能通过then()去获取,若通过then()获取了则就无Pro ...

  4. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

  5. .NET异步操作学习之一:Async/Await中异常的处理

    以前的异常处理,习惯了过程式的把出现的异常全部捕捉一遍,然后再进行处理.Async/Await关键字出来之后的确简化了异步编程,但也带来了一些问题.接下来自己将对这对关键字进行学习.然后把研究结果放在 ...

  6. (译文)学习ES6非常棒的特性——Async / Await函数

    try/catch 在使用Async/Await前,我们可能这样写: const main = (paramsA, paramsB, paramsC, done) => { funcA(para ...

  7. 已配置好的vue全家桶项目router,vuex,api,axios,vue-ls,async/await,less下载即使用

    github 地址: https://github.com/liangfengbo/vue-cli-project 点击进入 vue-cli-project 已构建配置好的vuejs全家桶项目,统一管 ...

  8. Async/Await 学习与示例

    参考:Async/await学习 es 7 提供了对 promise 对象的更好的操作,省去了很多丧心病狂的链式异步请求,promise 是回调地狱的福音,而 Async/Await 则是 promi ...

  9. JavaScript基础——深入学习async/await

    本文由云+社区发表 本篇文章,小编将和大家一起学习异步编程的未来--async/await,它会打破你对上篇文章Promise的认知,竟然异步代码还能这么写! 但是别太得意,你需要深入理解Promis ...

随机推荐

  1. C#后台解析 json 动态解析 通用(Dictionary)

    Dictionary<string, object> suggestions = JSONSerializer.Deserialize<Dictionary<string, o ...

  2. [YARN] 2.2 GB of 2.1 GB virtual memory used. Killing container.

    Spark程序在yarn的集群运行,出现 Current usage: 105.9 MB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual ...

  3. 这可能是最好的RxJava 2.x 入门教程(一)

    这可能是最好的 RxJava 2.x 入门教程系列专栏 文章链接: 这可能是最好的 RxJava 2.x 入门教程(完结版)[重磅推出] 这可能是最好的RxJava 2.x 入门教程(一) 这可能是最 ...

  4. BTrace使用简介

    很多时候在online的应用出现问题时,很多时候我们需要知道更多的程序的运行细节,但又不可能在开发的时候就把程序中所有的运行细节都打印到日志上,通常这个时候能采取的就是修改代码,重新部署,然后再观察, ...

  5. TensorFlow进阶(二)---张量的操作

    张量操作 在tensorflow中,有很多操作张量的函数,有生成张量.创建随机张量.张量类型与形状变换和张量的切片与运算 生成张量 固定值张量 tf.zeros(shape, dtype=tf.flo ...

  6. SpringMVC+Thymeleaf +HTML的简单框架

    一.问题 项目中需要公众号开发,移动端使用的是H5,但是如果不用前端框架的话,只能考虑JS前端用ajax解析JSON字符串了.今天我们就简单的说下前端框架Thymeleaf如何解决这个问题的: 二.开 ...

  7. (转)热空气扭曲效果shader

    转自:http://blog.sina.com.cn/s/blog_89d90b7c0102vaqy.html 热空气扭曲在大自然中形成是比较复杂的,这里只是通过取屏幕纹理和移动UV来模拟热扭曲效果. ...

  8. 【Java】关于MyBatis框架的总结

    最近在学习MyBatis框架,我在这里记录一下学习MyBatis过程中的心得体会. Mybatis是什么?使用它我们可以做什么? MyBatis是一个开源的数据持久层框架,它内部封装了通过JDBC访问 ...

  9. [转]oracle 常用的指令

    1.显示当前用户名 select user from dual; show user 2.显示当然用户有哪些表 select * from tab; 3.显示当所有用户的表 select * from ...

  10. oracle 12c common user与local user

    12c的多租户架构,引入CDB和PDB概念,使得用户也分为两种:common用户和local用户. 1.common用户就是数据库的用户,这个用户在root和每个已存在的或以后要创建的PDB都是相同的 ...