對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

相關文章
相關標籤/搜索