在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

如下,我有兩個函數(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ào)用上面兩個方法分別校驗兩個驗證碼是否正確,只有正確的情況下,才能去提交,于是我使用Promise.all() 去處理這兩個函數(shù),不知道這樣寫對不對,如果錯了,應(yīng)該怎么寫才對

提交函數(shù)

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

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

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

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

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

error錯誤是第二個函數(shù)的錯誤應(yīng)該是由于第二個函數(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只需要其中任何一個promise reject就會觸發(fā)。
如何捕獲所有的錯誤呢?

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);
});
// 控制臺輸出
[ 'a error', 'b error' ]

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

2018年4月5日 04:33