一.测试手写的Promise
npm i promises-aplus-tests -D
// 添加一个脚本
// ① test可自定义名称
// ② promises-aplus-tests 插件名
// ③ ./tomato/Promise 相对于package.json的文件路径
"scripts": {
"test": "promises-aplus-tests ./tomato/Promise"
},
// 这里的Promise可以替换为你自己定义的构造函数名
Promise.deferred = function () {
var result = {};
result.promise = new Promise(function (resolve, reject) {
result.resolve = resolve;
result.reject = reject;
});
return result;
}
module.exports = Promise;
# test可替换为你自定义的名称
npm run test
二.Promise A+ 规范
官网文档地址:https://promisesaplus.com/#notes
看了官方文档,前面的还挺好懂的,后面的有些晦涩。
个人理解,就是编写一个promise风格函数 的标准要求。
三.答题要点
-
Promise
的状态一经改变就不能再改变。 -
.then
和.catch
都会返回一个新的Promise
。 -
catch
不管被连接到哪里,都能捕获上层未捕捉过的错误。 -
在
Promise
中,返回任意一个非promise
的值都会被包裹成promise
对象,例如return 2
会被包装为return Promise.resolve(2)
。 -
Promise
的.then
或者.catch
可以被调用多次, 但如果Promise
内部的状态一经改变,并且有了一个值,那么后续每次调用.then
或者.catch
的时候都会直接拿到该值。 -
.then
或者.catch
中return
一个error
对象并不会抛出错误,所以不会被后续的.catch
捕获。 -
.then
或.catch
返回的值不能是 promise 本身,否则会造成死循环。 -
.then
或者.catch
的参数期望是函数,传入非函数则会发生值透传。 -
.then
方法是能接收两个参数的,第一个是处理成功的函数,第二个是处理失败的函数,再某些时候你可以认为catch
是.then
第二个参数的简便写法。 -
.finally
方法也是返回一个Promise
,他在Promise
结束的时候,无论结果为resolved
还是rejected
,都会执行里面的回调函数。
四.相关博客
- ECMAScript 6 入门 阮一峰
- B站总结的博客
- MDN-Promise
- 手把手一行一行代码教你“手写Promise“,完美通过 Promises/A+ 官方872个测试用例
- 45道Promise面试题一次爽到底
强烈建议 阅读一下
45道Promise面试题一次爽到底
这片博客,蛮不错的、
end
-
剩余事项:
-
手写一个class版本的promise 。
-
then方法实现异步,到底定时器好呢,还是微任务好呢?这个还没有完全理解。
-
方法中执行。