使用Promise.reject和javascript的正确方法是什么

时间:2019-05-20 08:19:22

标签: javascript node.js

我有以下这段代码

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)

拒绝诺言的正确方法是什么?

4 个答案:

答案 0 :(得分:4)

最简单的方法是使用if条件。即

new Promise((resolve, reject) => {
   // do something...
   if(somethingGoodHappened) {
      resolve(data)
   } else {
      reject(error)
   }
})

但是通常在处理异步请求时,您正在调用的东西通常会返回一个Promise,因此您可以在其中附加thencatch回调。

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));
        }
    })
})