对Promise中的resolve,reject,catch的理解

对promise这个概念以前已经有了一些浅显的理解,相关文章->戳这里,最近又有了一些新的理解。promise

.then()的时候究竟是在then什么…
首先要理解…Promise是一个对象,有then()方法的对象
then()的入参是一个函数,一般在promise链中,入参是 一个返回promise的函数 ,这句话好像有点拗口,就是说入参是一个函数,这个函数会return一个promise对象
如何破坏promise链
若是有这样一个promise链:函数

p1().then(p2).then(p3)
  .then(function(data) {
    console.log('data: ' + data);
  })
  .catch(function(error) {
    console.log('error: ' + error);
  });
 
function p1() {
  return new Promise(function(resolve, reject) {
    console.log('p1 resolved');
    resolve(123);
  });
}
 
function p2() {
  return new Promise(function(resolve, reject) {
    console.log('p2 rejected');
    reject(456);
  });
}
 
function p3() {
  return new Promise(function(resolve, reject) {
    console.log('p3 resolved');
    resolve(789);
  });
}

上面这个例子,你看到的console.log会是这样:code

p1 resolved
p2 rejected
error: 456对象

并无看到 p3 的log,而是看到了error message,也就是说:队列

在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject以后的promise都不会再执行,而是直接调用.catch方法。
这也是为何在standard practice中,必定要在最后加上 .catch 的缘由。经过 .catch 可以清楚的判断出promise链在哪一个环节出了问题。资源

如何按顺序执行已经定义的promise
这个状况在何时会用到呢?好比你有一个队列,队列里有不少任务,这些任务并不互相依赖执行后返回的结果。每一个任务完成的时间都是不肯定的,而且计算资源只容许一次执行一个任务。简单的来讲,就是 作完A以后再去作B,而且AB是相互独立的get

假如我如今有一堆promise对象,大概长这样:io

//p2, p3与p1类似
//当doSomething()执行完毕的时候,调用resolve()
//使得当前promise状态转变为fulfilled便可
var p1 = new Promise(function(resolve, reject) {
  //do something here
  //when do something done
  resolve();
});

 

p1.then(function() {
    return p2
  })
  .then(function() {
    return p3
  })
  .catch()

请注意,前一部破坏Promise链中分定义的p1 p2 p3是 函数 ,而此部分定义的p1 p2 p3是 对象!对象!对象!console

如前面提到,promise是一个有then方法的对象,所以p1能够直接调用then
Q:为何开头调用不是 p1().then ?
A: 由于p1是一个对象啊!!!对象啊!!!象啊!!!啊!!!
然而promise链中then方法的入参是 一个返回promise对象的函数 ,p2并非一个函数,所以不能then(p2);
但p2是一个promise对象,已经知足了then方法入参的一半需求,那么写一个函数而且返回p2,就知足了入参的所有需求function

相关文章
相关标签/搜索