我有以下这段代码
new Promise((resolve, reject) => {
resolve(apiRequest(data))
reject(console.log('Error'))
}).then(response)
两种方法(解析和拒绝)都被触发,但是我只想在出现问题时才调用拒绝。 如果在这种情况下出现问题,如何抛出错误?
我检查了一下,但似乎无法使用If语句进行检查。
new Promise((resolve, reject) => {
const printResult = apiRequest(data)
console.log(printResult) //Outputs Promise {<pending>}
resolve(printResult) //Then it works
reject(console.log('Error'))
}).then(response)
拒绝诺言的正确方法是什么?
答案 0 :(得分:4)
最简单的方法是使用if
条件。即
new Promise((resolve, reject) => {
// do something...
if(somethingGoodHappened) {
resolve(data)
} else {
reject(error)
}
})
但是通常在处理异步请求时,您正在调用的东西通常会返回一个Promise,因此您可以在其中附加then
和catch
回调。
apiRequest(data)
.then((result) => {
// all good
})
.catch((err) => {
console.log(err)
})
答案 1 :(得分:1)
const mock_api = () => new Promise((res, rej) => {
const number = Math.floor((Math.random() * 100) + 1);
setTimeout(() => {
if (number%2==0) return res('randomly RESOLVED')
return rej('randomly REJECTED')
}, 2000)
})
const async_promise = () => new Promise(async (resolve, reject) => {
try {
const resolvedPromise = await mock_api()
resolve(resolvedPromise)
} catch (e) {
reject(e)
}
})
const classicPromise = () => new Promise((resolve, reject) => {
mock_api()
.then(resolve)
.catch(reject)
})
const makeAsyncRequest = async () => {
try {
const data = await async_promise()
console.log('ASYNC AWAIT RESOLVE', data)
} catch (e) {
console.log('ASYNC AWAIT ERR', e)
}
}
makeAsyncRequest()
classicPromise()
.then(r => console.log('PROMISE CHAIN RESOLVE', r))
.catch(e => console.log('PROMISE CHAIN ERR', e))
答案 2 :(得分:0)
因为您在拒绝之前先解决,所以它不会遇到拒绝,
您可以使用:
if (printResult) {
resolve(printResult)
} else {
reject(console.log('Error'))
}
答案 3 :(得分:0)
您可以捕获异常并将其作为已拒绝的承诺返回
function asyncFunc() {
try {
doSomethingSync();
return doSomethingAsync()
.then(result => {
···
});
} catch (err) {
return Promise.reject(err);
}
}
总是检查err是否有任何错误返回承诺(以下示例)
// Return new promise
return new Promise(function(resolve, reject) {
// Do async job
request.get(options, function(err, resp, body) {
if (err) {
reject(err);
} else {
resolve(JSON.parse(body));
}
})
})