2017-12-27 332 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.`