ECMAScript 6 学习系列课程 (ES6 Promise对象的使用)
来源:互联网 发布:linux复制并覆盖 编辑:程序博客网 时间:2024/05/16 06:53
Promise是异步编程的一种解决方案, ES6 这一特性很大程度上提高了开发者的效率,如果用过Angular的同学,一定会用到$q的resolve和reject函数,同理promise也提供原生的解决方案,不需要任何框架支持。
我们下面看一下代码:
function msgAfterTimeout (msg, who, timeout) { return new Promise((resolve, reject) => { setTimeout(() => resolve(`${msg} Hello ${who}!`), timeout) })}msgAfterTimeout("", "Foo", 100).then((msg) => msgAfterTimeout(msg, "Bar", 200)).then((msg) => { console.log(`done after 300ms:${msg}`)})
上面代码如果用ES5实现该如何改写呢?
function msgAfterTimeout (msg, who, timeout, onDone) { setTimeout(function () { onDone(msg + " Hello " + who + "!"); }, timeout);}msgAfterTimeout("", "Foo", 100, function (msg) { msgAfterTimeout(msg, "Bar", 200, function (msg) { console.log("done after 300ms:" + msg); });});
对于处理多个异步,类似于$q.all()的语法在ES6中也是支持的, 例如:
function fetchAsync (url, timeout, onData, onError) { …}let fetchPromised = (url, timeout) => { return new Promise((resolve, reject) => { fetchAsync(url, timeout, resolve, reject) })}Promise.all([ fetchPromised("http://backend/foo.txt", 500), fetchPromised("http://backend/bar.txt", 500), fetchPromised("http://backend/baz.txt", 500)]).then((data) => { let [ foo, bar, baz ] = data console.log(`success: foo=${foo} bar=${bar} baz=${baz}`)}, (err) => { console.log(`error: ${err}`)})
对于ES5标准的改写上面代码,是这样的:
function fetchAsync (url, timeout, onData, onError) { …}function fetchAll (request, onData, onError) { var result = [], results = 0; for (var i = 0; i < request.length; i++) { result[i] = null; (function (i) { fetchAsync(request[i].url, request[i].timeout, function (data) { result[i] = data; if (++results === request.length) onData(result); }, onError); })(i); }}fetchAll([ { url: "http://backend/foo.txt", timeout: 500 }, { url: "http://backend/bar.txt", timeout: 500 }, { url: "http://backend/baz.txt", timeout: 500 }], function (data) { var foo = data[0], bar = data[1], baz = data[2]; console.log("success: foo=" + foo + " bar=" + bar + " baz=" + baz);}, function (err) { console.log("error: " + err);});
是不是很简洁很多呢,尝试一下吧!
0 0
- ECMAScript 6 学习系列课程 (ES6 Promise对象的使用)
- ECMAScript 6 学习系列课程 (ES6 Modules的使用)
- ECMAScript 6 学习系列课程 (ES6 对象的最新用法)
- ECMAScript 6 学习系列课程 (ES6 Symbol语法的使用)
- ECMAScript 6 学习系列课程 (ES6 Generator 函数的使用)
- ECMAScript 6 学习系列课程 (ES6 常用内置方法的使用)
- ECMAScript 6 学习系列课程 (ES6 箭头函数的使用)
- ECMAScript 6 学习系列课程 (ES6 默认值和解构赋值的使用)
- ECMAScript 6 学习系列课程 (ES6简介)
- ECMAScript 6 学习系列课程 (ES6 Internationalization & Localization的介绍)
- ECMAScript 6 学习系列课程 (ES6 gulp+babel 语法转化的相关用法)
- ECMAScript 6 学习系列课程 (ES6 proxy和Reflect的相关用法)
- ECMAScript 6 学习系列课程 (ES6 class的相关用法)
- ECMAScript 6 学习系列课程 (ES6 Set和Map数据结构)
- ECMAScript 2015(ES6)规范中的promise
- ES6 Promise对象的学习笔记
- ECMAScript 6 学习系列课程笔记
- ECMAScript 6 入门--Promise 对象
- java 的transient关键字的作用
- 海量数据处理 算法总结
- 汉诺塔VII
- 通过反射修改ViewPager最小滑动距离mTouchSlop
- 升级版draggedLayout *固定其中一个按钮*
- ECMAScript 6 学习系列课程 (ES6 Promise对象的使用)
- Java笔记--垃圾回收机制
- 暴风魔镜实现一个简单的VR
- dataTables笔记
- unable to dequeue a cell with identifier cell - must register a nib or a class for the identifier or
- 如何编写RPC接口学习
- 读书笔记-java网络编程-4Internet-NetworkInterface类
- PL/SQL如何调试Oracle存储过程
- JavaScript的 Event Loop 模型