https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
使用方法
一般来说是这样使用的:
首先将某个传统的回调型异步函数转换为 Promise 型。
let fun = function(arg, callback) {};
let funPromise = arg=>{
return new Promise((ok, ko)=>{
fun(arg, (err, data)=>{
if(err) ko(err);
else ok(data);
});
});
};
funPromise('arg')
.then(data=>{})
.then(()=>{})
.catch(err=>{});
每一个 then() 里面至多一个异步函数。(不允许嵌套)
这时将这个异步函数也改写成 Promise 对象,并且将其 return 即可。
某个 then() 里面也有可能没有异步函数,仅仅是同步代码。
这时将要传输的内容直接 return,即可传递给下一个 then()
错误处理
在 then() 中直接使用 throw new Error()
,在 new Promise() 中不能这么做。
四个静态方法
Promise.all()
接受 Promises 组成的数组或 Object,返回一个 Promise。
并发执行,当那些 Promises 均成功执行才会成功,否则失败。
Promise.race()
和上面类似,不过是看哪个 Promise 最先执行完,它成功自己就成功,它失败就失败。
Promise.resolve(arg)
返回一个已经成功执行一个步骤,并 return arg
的 Promise 对象。可以直接接在后面写 .then(arg=>{})
不过如果通过此方法而不是 new Promise()
来作为任务链的开始,通常是不必要的,因为 Promise 任务链的开始往往是一个异步函数,而不应该是一些同步的语句。
Promise.reject(arg)
和上面类似,返回失败的一个 Promise 对象。
需要注意的
-
Promise.prototype.then()
其实接受了 2 个函数作为参数,其中第二个参数会在上一个步骤失败的时候被调用。 -
在
.catch()
后面再加个.then()
可以实现 try-catch-final 的结构。
Promise 可运用于 async 函数中的 await 后面,实现最优雅的异步工作。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function
Promisify 工具:
1. https://github.com/digitaldesignlabs/es6-promisify
2. https://github.com/nodegit/promisify-node
目前js有很多框架要致力解决js金字塔回调,让异步代码书写的逻辑更为清晰,如async, wind.js, promise, deffer。
async 代码:
可读性不比 Promise 差,缺点也和 Promise 一样:
需要额外的代码来维护这一系列异步代码,而 await 就不需要。