对Promise的学习总结与思考

学习地址详见: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实例对象。

    原文作者:specialCoder
    原文地址: https://segmentfault.com/a/1190000011553542
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞