学习地址详见:http://es6.ruanyifeng.com/#do…
正文
1.调用resolve或reject并不会终结 Promise 的参数函数的执行
new Promise((resolve, reject) => {
resolve(1);
console.log(2);
}).then(r => {
console.log(r);
});
// 2
// 1
调用resolve(1)以后,后面的console.log(2)还是会执行,并且会首先打印出来。这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。
一般来说,调用resolve或reject以后,Promise 的使命就完成了,后继操作应该放到then方法里面,而不应该直接写在resolve或reject的后面。所以,最好在它们前面加上return语句,这样就不会有意外。
2.关于catch
getJSON('/posts.json').then(function(posts) {
// ...
}).catch(function(error) {
// 处理 getJSON 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error);
});
上面代码中,getJSON方法返回一个 Promise 对象,如果该对象状态变为resolved,则会调用then方法指定的回调函数;如果异步操作抛出错误,状态就会变为rejected,就会调用catch方法指定的回调函数,处理这个错误。另外,then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
1)状态变成reject 的方式有两个:手动操作 reject() reject方法的作用,等同于抛出错误; 异步操作抛出错误,状态就会变为rejected
2)触发catch: 异步操作状态变为rejected; then方法运行中抛出错误
3)一般来说,不要在then方法里面定义Reject状态的回调函数(即then的第二个参数),总是使用catch方法。
思考:第一步出错,是直接执行catch还是接着走then? 直接被catch
3.Promise 内部的错误不会影响到 Promise 外部的代码
4.任务队列
new Promise是同步的,会马上执行function参数中的事情。等function参数执行完,new Promise才返回一个promise实例对象。