async/await async 是Generator函数的语法糖,并对Generator函数进行了改进。ES7 版本中引入
一个线程(或函数)执行到一半,可以暂停执行,将执行权交给另一个线程(或函数),等到稍后收回执行权的时候,再恢复执行。这种可以并行执行、交换执行权的线程(或函数),就称为协程。协程是一种比线程更加轻量级的存在。
普通线程是抢先式的,会争夺cpu资源,而协程是合作的,可以把协程看成是跑在线程上的任务,一个线程上可以存在多个协程,但是在线程上同时只能执行一个协程。
// async/awaitasync getBooksByAuthorWithAwait(authorId) {const books = await bookModel.fetchAll();  return books.filter(b => b.authorId === authorId);
}// promise
getBooksByAuthorWithPromise(authorId) { return bookModel.fetchAll().then(books => books.filter(b => b.authorId === authorId));
}
async/await 是线性的,更容易理解, 调试的时候更加方便缺点 会造成代码阻塞,导致性能问题
过于线性化async getBooksAndAuthor(authorId) {  const books = await bookModel.fetchAll();  const author = await authorModel.fetch(authorId);  return {    author,    books: books.filter(book => book.authorId === authorId),  };
}// 请求没有依赖关系,过于线性化,请求时间过长async getBooksAndAuthor(authorId) {  const bookPromise = bookModel.fetchAll();  const authorPromise = authorModel.fetch(authorId);  const book = await bookPromise;  const author = await authorPromise;  return {    author,    books: books.filter(book => book.authorId === authorId),  };
}// 没有依赖关系,正确使用方式
错误处理方式方式一 try...catchclass BookModel {  fetchAll() {    return new Promise((resolve, reject) => {      window.setTimeout(() => { reject({'error': 400}) }, 1000);    });  }
}// async/await
async getBooksByAuthorWithAwait(authorId) {try {  const books = await bookModel.fetchAll();} catch (error) {  console.log(error);    // { "error": 400 }}
}优点  方便,简单可以集中处理,所有错误缺点 不能准确定位错误的位置
class BookModel {  fetchAll() {    cb();    // note `cb` is undefined and will result an exception    return fetch('/books');  }
}try {  bookModel.fetchAll();
} catch(error) {  console.log(error);  // This will print "cb is not defined"
}
方式二 catch// books === undefined if error happens,
// since nothing returned in the catch statement
let books = await bookModel.fetchAll().catch((error) => {console.log(error); });
方式三 await-to-js/*** @param { Promise } promise* @param { Object= } errorExt - Additional Information you can pass to the err object* @return { Promise }*/
export function to<T, U = Error> (promise: Promise<T>,errorExt?: object
): Promise<[U | null, T | undefined]> {return promise.then<[null, T]>((data: T) => [null, data]).catch<[U, undefined]>((err: U) => {if (errorExt) {Object.assign(err, errorExt);}return [err, undefined];});
}export default to;import to from '../../dist';const UserModel = {findById: (userId) => {return new Promise((resolve, reject) => {if(userId) {const userObjet = {id: userId,notificationsEnabled: true};return resolve(userObjet);}reject('Data is missing');});}
};const TaskModel = function ({userId, name}) {return new Promise((resolve, reject) => {if(userId && name) {const newTask = {assignedUser: {id: userId}};return resolve(newTask);}reject('Data is missing');});
};const NotificationService = {sendNotification: (userId, name) => {return new Promise((resolve, reject) => {if(userId && name) return resolve('Success');reject('Data is missing');});}
};async function asyncTask(userId, cb) {let err, user, savedTask, notification;[ err, user ] = await to(UserModel.findById(userId));if(!(user && user.id)) return cb('No user found');[ err, savedTask] = await to(TaskModel({userId: user.id, name: 'Demo Task'}));if(err) return cb('Error occurred while saving task');if(user.notificationsEnabled) {[ err ] = await to(NotificationService.sendNotification(user.id, 'Task Created'));if(err) return cb('Error while sending notification');}if(savedTask.assignedUser.id !== user.id) {[ err, notification ] = await to(NotificationService.sendNotification(savedTask.assignedUser.id, 'Task was created for you'));if(err) return cb('Error while sending notification');}cb(null, savedTask);
}asyncTask(1, (err, newTask) => {console.log('new task created');console.log(err);console.log(newTask);
});asyncTask(null, (err, newTask) => {console.log('fail');console.log(err);console.log(newTask);
});interface ServerResponse {test: number;
}const p = Promise.resolve({test: 123});const [err, data] = await to<ServerResponse>(p);
console.log(data.test);
for(fname of files) {let fcontent = await read(fname);}
for(idx in files) {let fcontent = await read(files[idx])}
files.forEach( async fname => {let fcontent = await read(fname)
})
const mapLoop = async _ => {console.log('Start');const promises = fruitsToGet.map(async fruit => {const numFruit = await getNumFruit(fruit);return numFruit;});const numFruits = await Promise.all(promises);console.log(numFruits);console.log('End')
}
filter  回调中使用await时,回调总是一个promise。由于promise 总是真的,数组中的所有项都通过filter;先map处理完数据后,正常使用filter即可reduce 同样的道理

Async/Await(异步处理)相关推荐

  1. @async 默认线程池_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

  2. 同步方法 调用异步防范_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

  3. Microsoft.Bcl.Async 使用总结--在.NET Framework 4.5项目上使用.NET Framework 4.5版本及以上版本才可以使用C# 5中的async/await异步特

    正常情况下async/await异步特性,只能在.NET Framework 4.5以上的版本才可以使用,那如果想在.NET Framework 4使用C# 5中的异步特性怎么办呢?还好有一个开源的类 ...

  4. Python 3.5将支持Async/Await异步编程

    根据Python增强提案(PEP) 第0492号, Python 3.5将通过async和await语法增加对协程的支持.该提案目的是使协程成为Python语言的原生特性,并"建立一种普遍. ...

  5. Async/Await异步

    Async/Await是目前异步最好的结局方案. let p1=function () {return new Promise((resolve)=>{setTimeout(()=>res ...

  6. .net async/await 异步等待的数种情况

    .net 4.5 中增加了async/await,使写异步代码能像写同步代码那样,甚至伪同步执行,真是个非常好用的东西.不过,有时候我们会希望这些异步代码能伪同步执行,有时候又希望能真异步执行.所以a ...

  7. vue methods async await 异步函数

    async:作为一个关键字放到函数之前,表示函数是异步的函数,因为async就是异步的意思, 异步函数也就意味着该函数的执行不会阻塞后面代码的执行,async 函数返回的是一个promise 对象 a ...

  8. async await异步

    介绍Promise 既然有了promise 为什么还要有async await ? 因为promise 不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. Promi ...

  9. Async await 异步编程说明

    希望在编程上有些许提高所以 最近连续2篇博客都在说明多线程和异步编程的使用,异步和多线程之间区别请自行百度,因为理解不是特别透彻就不在叙述以免误导大家,这里写下新研究整理 task  和 await ...

  10. C# async/await异步编程深入理解

    异步函数简介 一般指 async 修饰符声明得.可包含await表达式得方法或匿名函数. 声明方式 异步方法的声明语法与其他方法完全一样, 只是需要包含 async 关键字.async可以出现在返回值 ...

最新文章

  1. mysql 5.7 收费_MySQL5.7 常用用户操作
  2. mysql key value 排序_MySQL利用索引优化ORDER BY排序语句的方法
  3. arcgis api for javascript 距离与面积量算
  4. 黑盒測试(一)-----边界值測试
  5. 深刻理解:反向代理服务器
  6. 【安全漏洞】朝鲜InkySquid APT组织是怎么利用浏览器漏洞感染受害者
  7. 程序组件通信方案集锦
  8. redis哨兵相关详解
  9. MUI框架:移动端底部固定mui-bar-tab布局 - 案例篇
  10. GROUP BY,WHERE,HAVING之间的差别和使用方法
  11. SAP BUSINESS ONE的优势
  12. window.location.href重定向 不会触发webview
  13. linux如何看java安装路径,linux查看java的安装路径
  14. 在线2-36任意进制转换工具
  15. 同步、异步的使用场景及好处
  16. 怎么学习大数据,入门大数据要掌握哪些知识?
  17. 安装Linux系统不分区的问题,浅谈linux系统的分区问题
  18. ngx-bootstrap学习笔记
  19. 内部存储器——③主存储器
  20. UNIX的spctl命令

热门文章

  1. 信安教程第二版-第22章网站安全需求分析与安全保护工程
  2. linux 数据库 超出,[QAD]数据库超过2G,备份出现问题(linux)
  3. SpringBoot 如何配置静态资源的地址与访问路径
  4. bootstrap-table全选当前页所有数据checkAll
  5. 「雕爷学编程」Arduino动手做(22)——8X8 LED点阵MAX7219屏
  6. chap01 .net 基本框架介绍
  7. 滑动窗口解决最小子串问题 leetcode3. Longest Substring Without Repeating Characters
  8. Centos系统查看CPU有关信息
  9. 【2】最简单的Laravel5.1程序分析
  10. Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性)