鍍金池/ 問(wèn)答/HTML/ 關(guān)于promise函數(shù)的用法,我這樣寫是對(duì)的嗎?

關(guān)于promise函數(shù)的用法,我這樣寫是對(duì)的嗎?

如下,我有兩個(gè)函數(shù),寫成了promis 形式

函數(shù)一

verifyGA(type){
      let that = this;
      return new Promise((resolve,reject) => {
        that.$post('/user/verifyGA',{
          gaCode:that.gaCode,
          captchaType:type
        }).then(res=>{
          if (!res.code) {
            resolve(true)
          } else {
            reject(res.message)
            that.gaError = res.message;
          }
        })
      })
    },

函數(shù)二

checkCode(type){
      let that = this;
      let bind = this.isEmail ? 32:31;
      let Untie = this.isEmail ? 34:33;
      let code_type = type == 1 ? bind:Untie;
      return new Promise((resolve,reject) => {
        that.$post('/user/checkCode',{
          code:that.code,
          codeType:code_type
        }).then(res=>{
          if (!res.code) {
            resolve(true)
          } else {
            reject(res.message)
            that.codeError = res.message;
          }
        })
      })
    },

現(xiàn)在我的需求是點(diǎn)擊提交按鈕的時(shí)候,去調(diào)用上面兩個(gè)方法分別校驗(yàn)兩個(gè)驗(yàn)證碼是否正確,只有正確的情況下,才能去提交,于是我使用Promise.all() 去處理這兩個(gè)函數(shù),不知道這樣寫對(duì)不對(duì),如果錯(cuò)了,應(yīng)該怎么寫才對(duì)

提交函數(shù)

confirm(){
      let that = this;
      Promise.all([this.verifyGA(12),this.checkCode(1)]).then(res=>{
        console.log(res);
        /* 正常處理提交流程 */
      }).catch(error=>{
        console.log(error);
        /* 拋出錯(cuò)誤 */
      })
    }

然后我發(fā)現(xiàn)如果上面兩個(gè)函數(shù)都請(qǐng)求失敗的時(shí)候,promise.all().catch() 中拋出的error錯(cuò)誤是第二個(gè)函數(shù)中的錯(cuò)誤,而不是第一個(gè)函數(shù)的,這是為什么,如何才能拋出所有函數(shù)的錯(cuò)誤呢?

回答
編輯回答
憶當(dāng)年
Promise.all(iterable) 方法返回一個(gè) Promise 實(shí)例,此實(shí)例在 iterable 參數(shù)內(nèi)所有的 promise 都“完成(resolved)”或參數(shù)中不包含 promise 時(shí)回調(diào)完成(resolve);如果參數(shù)中 promise 有一個(gè)失?。╮ejected),此實(shí)例回調(diào)失?。╮eject),失敗原因的是第一個(gè)失敗 promise 的結(jié)果。
MDN

Promise.all只會(huì)返回第一個(gè)被rejected的結(jié)果。

2017年6月15日 06:24
編輯回答
久礙你

error錯(cuò)誤是第二個(gè)函數(shù)的錯(cuò)誤應(yīng)該是由于第二個(gè)函數(shù)的reject執(zhí)行的更早。

const a = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      reject("a error");
    }, 300);
  });
}
const b = () => {
  return Promise.reject('b error')
}

Promise.all([a(), b()])
.then(data => {
  console.log(data);
})
.catch(err => {
  console.error(err);
});
// 輸出
b error

Promise.all resolve的觸發(fā)需要數(shù)組中所有的promise都resolve,而reject只需要其中任何一個(gè)promise reject就會(huì)觸發(fā)。
如何捕獲所有的錯(cuò)誤呢?

const a = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      reject("a error");
    }, 300);
  });
}
const b = () => {
  return Promise.reject('b error')
}

Promise.all([a().catch(err => err), b().catch(err => err)])
.then(data => {
  console.log(data);
})
.catch(err => {
  console.error(err);
});
// 控制臺(tái)輸出
[ 'a error', 'b error' ]

需要注意的是這里輸出其實(shí)是console.log(data)執(zhí)行,而非console.error(err)執(zhí)行

2018年4月5日 04:33