sleep()在ES7中利用Promise和async/await的优雅实现
2017-11-11 19:29
686 查看
sleep()的优雅实现
演示
var sleep = async (duration) => { return new Promise((resolve, reject) => { setTimeout(resolve, duration); }); }; (async () => { console.log("start!"+new Date().toISOString()); console.time("timer1"); await sleep(2000);//阻塞该async方法的执行线程,直到sleep()返回的Promise resolve console.timeEnd("timer1"); console.log("end"+new Date().toISOString()); })(); console.log("after sleep test!");
输出
start!2017-11-11T11:25:28.834Z after sleep test! timer1: 2000.845947265625ms end2017-11-11T11:25:30.838Z
可见这个定时器工作的还是不错滴。
Promise 简介
Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示,它实际上是一个执行器(executor)做下的承诺,代表执行器在执行完毕时,会返回某个值,或者在失败时,会输出某个错误状态。构造函数:
new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;
简记:
new Promise<T>(/*executor*/(resolve,reject)=>{})
executor在Promise构造函数执行时同步执行,这里承诺executor在该构造函数返回的对象之前一定会被调用。
新创建的Promise内部状态是pending。executor内部通常会执行一些异步操作,一旦完成,可以调用resolve()函数来将promise状态改成fulfilled,或者在发生错误时调用reject()方法将它的状态改为rejected。
如果在executor函数中抛出一个错误,那么该promise状态为rejected,executor函数的返回值被忽略。
成员方法
Promise.all(iterable);
构造一个新的Promise,需要等到iterable中所有的Promise全部调用resolve,新Promise才会resolve,这个resolve传递的是所有resolve传递的值按照iterable中顺序排列的相应返回值的数组。或者其中只要有一个调用reject,则新Promise执行reject。Promise.race(iterable);
构造一个新的Promise,iterable中只要有一个Promise执行resolve或者reject,则新的Promise执行resolve或者reject。Promise.reject(message);
返回一个状态为rejected的Promise,附带信息。Promise.resolve(value);
返回一个状态为fulfilled的Promise。实际实现的时候,上面四个方法实际上是接口PromiseConstructor的成员方法,它们是全局变量Promise(
declare var Promise: PromiseConstructor;)的调用.
原型
Promise.prototype.then(onResolved,onReject):Promise
添加肯定和否定回调到当前 promise, 返回一个新的、将以回调的返回值来resolve的promise。Promise.prototype.catch(onRejected)
添加一个否定回调到当前promise,返回一个新的、将以回调的返回值来resolve的promise。如果当前promise执行顺利,进入的状态是fulfilled,换言之,onRejected不会被调用,则以当前promise的resolve结果作为新的promise的resolve结果。实际上,catch和then是接口Promise的成员方法,而全局变量Promise的接口类型PromiseConstructor持有一个readonly的属性prototype。
看这一段代码和文档的时候,一定要搞清楚接口Promise和全局变量Promise的区别。
async/await
async function 函数声明将定义一个异步函数,返回 AsyncFunction 对象。async语法:
async function name([param[, param[, … param]]]) { statements }params | description |
---|---|
name | 函数名称。 |
param | 要传递给函数的参数的名称。 |
statements | 函数体语句。 |
- | - |
返回值 | 一个 AsyncFunction 对象,表示一个异步函数。 |
await表达式:await <promise:Promise>
await表达式只能在async方法中使用,await可以用来阻塞一个async方法的执行。直到await表达式的Promise中resolve或者reject。并且会将Promise.resolve的返回值作为await表达式的返回值。如果Promise使用reject传出了错误消息,那么await表达式将会抛出异常。例子
var asyncError=async (message,duration=200) => { return new Promise((resolve, reject) => { setTimeout(reject(message), duration); }); }; (async () => { let v; try{ v= await asyncError("a promise reject something"); }catch(e){ console.log(`error is ${e}`); } console.log(`asyncError return ${v}`); })();
输出结果
error is a promise reject something asyncError return undefined
更多资料:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function
相关文章推荐
- es5、promise、async以及generator中实现sleep的方法
- 使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
- 用async-await实现类似Promise.all()的执行效果
- 体验异步的终极解决方案-ES7的Async/Await
- React项目配置7(ES7的Async/Await的使用)
- 利用ScriptableObject在U3D里优雅地实现自定义配置文件
- 前端面试送命题(二)-callback,promise,generator,async-await
- Async/Await替代Promise的6个理由
- 快速理解ES7 await/async
- ES7中利用Await减少回调嵌套的方法详解
- Callback Promise Generator Async-Await 和异常处理的演进
- 关于Promise与async/await的例子
- 理解ES7中的async/await
- java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现
- Node.js异步控制流:回调、事件、Promise和async/await
- 体验异步的终极解决方案-ES7的Async/Await
- 【Java进阶】利用APT优雅的实现统一日志格式
- 利用pthread_cond_timedwait实现sleep
- Swift udp实现根据端口号监听广播数据(利用GCDAsyncUdpSocket实现)
- Async/await和promise