2017-12-27 576 views
3

我已經通過其他stackoverflow答案看了,似乎無法找到答案。Promise.all從API的拒絕

實際上,我正在寫一個模塊來驗證一些數據,然後如果沒有錯誤將它傳遞給第三方api。

我的問題是,如果Promise.all拒絕,那麼我的初始呼叫承諾仍然移動到下一個。

------my main app--------- 

const data = [1,0,1] 
api.sendData(data) 
    .then(() => { 
     *ALWAYS HITTING THIS* 
    }) 
    .catch(err => console.log(err)) 

---------the api--------- 

return await a.test(data).then(rd => { 
    return rd 
}) 
.catch(ed => { 
    return ed 
}); 

-----a.test function-------- 

let request = data.map((i) => { 
    return new Promise((resolve, reject) => { 
     if(i < 1) { 
      reject('value to low') 
     } 
     resolve(i); 
    }); 
}); 
    return await Promise.all(data) 
}); 

有誰能告訴我爲什麼我的catch沒有在我的主應用程序中被擊中? 上面的代碼是僞的,但描述了這個問題。

+0

爲什麼,鄰爲什麼這麼多的人認爲'返回等待somePromise'永遠是正確的做法?提示,沒有理由在那裏使用「等待」。你以任何一種方式回覆承諾。 – jfriend00

回答

3

我認爲這個問題是來自你抓住的API函數的錯誤和catch method return a new promise(滿足你有效地返回一個值)

,所以如果你不抓住錯誤的事實,你的問題應該是固定的因爲錯誤將被轉發

return a.test(data).then(rd => { 
    // do some stuffs ... 

    return rd; 
}) 
// no catch 
+0

你也應該[放棄無意義的'.then(rd => rd)'](https://stackoverflow.com/q/41089122/1048572)。而[無謂的'等待'](https://stackoverflow.com/q/43353087/1048572)。可能是整個功能:-) – Bergi

+1

你是對的。雖然,我認爲代碼被簡化爲可讀性,而真正的代碼實際上做了一些事情;) – laurent

+0

謝謝,這是它:-) – dave

2

你可能有一個錯字。 正如你寫的,你嘗試Promise.all()一個整數數組,這將全部解決。

您應該返回return await Promise.all(request)而不是return await Promise.all(data),因爲否則不會有任何被拒絕的承諾。

1

你只能抓一個承諾一次,你在catch返回的內容是怎樣的未來then將解決或拒絕:

Promise.reject(88) 
 
.catch(err=>"Hello World") 
 
.then(resolve=>console.log("resolve is:",resolve)) 
 

 
Promise.reject(88) 
 
.catch(err=>Promise.reject("Hello World"))//reject again 
 
.catch(err=>console.log("reject is:",err))

相反的:

return await a.test(data).then(rd => { 
    return rd 
}) 
.catch(ed => { 
    return ed 
});` 

你可以這樣做:return a.test(data)

提供沒有任何意義的其他代碼。如果您想提出一些請求,但希望獲得所有結果,即使其中一些失敗,您也可以查看this answer(最後一個代碼塊)。

這一回答解釋了一下爲什麼創建的承諾,我會建議你,直到你明白什麼是承諾,以及如何使用不使用異步語法them.`