如何.catch Promise.reject

时间:2017-09-01 18:19:24

标签: javascript es6-promise

我有一个帮助函数,用于将fetch与CouchDB一起使用,结尾为:

...
return fetch(...)
  .then(resp => resp.ok ? resp.json() : Promise.reject(resp))
  .then(json => json.error ? Promise.reject(json) : json)

当我在其他地方使用它时,我的印象是我可以.catch明确拒绝:

  above_function(its_options)
    .then(do_something)
    .catch(err => do_something_with_the_json_error_rejection_or_resp_not_ok_rejection_or_the_above(err))
但是,唉,我似乎无法控制拒绝。 我之后的特定错误是HTTP 401响应。

是什么给出了?

(请注意return s中隐含的ES6 .then

4 个答案:

答案 0 :(得分:34)



    function test() {
        return new Promise((resolve, reject) => {
        return reject('rejected')
      })
    }

    test().then(function() {
      //here when you resolve
    })
    .catch(function(rej) {
      //here when you reject the promise
      console.log(rej);
    });




答案 1 :(得分:3)

确保每次拨打then()都会返回一个值。

例如

var url = 'https://www.google.co.in';
var options = {};
var resolves = Promise.resolve();

resolves.then(() => {
  console.log('Resolved first promise');
  var fetchPromise = fetch(url, options);
  fetchPromise.then(() => {
    console.log('Completed fetch');
  });
})
.catch(error => {
  console.log('Error', error);
});

请注意console显示未捕获的异常。但是,如果您返回了内部承诺(或任何其他值,最终通过resolve转变为承诺),您最终会使承诺变得扁平化,因此异常会冒泡。

var url = 'https://www.google.co.in';
var options = {};
var resolves = Promise.resolve();

resolves.then(() => {
  console.log('Resolved first promise');
  var fetchPromise = fetch(url, options);
  return fetchPromise.then(() => {
    console.log('Completed fetch');
  });
})
.catch(error => {
  console.log('Error', error);
});

请注意,异常会冒充外部承诺。希望这能清除一些事情。

答案 2 :(得分:0)

承诺拒绝属于then函数的第二个参数。

function test() {
    return new Promise((resolve, reject) => {
    return reject('rejected')
  })
}

test().then(function() {
  //here when you resolve
}, function(rej) {
  //here when you reject the promise
    console.log(rej)
})

答案 3 :(得分:0)

为什么不将其包装在try / catch块中,我已从ivo复制了以下内容

function test() {
    return new Promise((resolve, reject) => {
        return reject('rejected');
    })};

(async ()=>{
    try{
        await test()
    }catch(er){
        console.log(er)
}})();