转换被拒绝的承诺中的值

时间:2014-10-02 11:18:22

标签: javascript promise

鉴于我有一个被拒绝的承诺:

var promise = new Promise(function(resolve, reject) {
  reject({error_message: "Foo"});
});

我想改变这个承诺(在这种情况下:提取错误信息):

var new_promise = promise.then(function(response) {
  return response.id;
}, function(error) {
  return error.error_message;
});

当我再次履行承诺时:

new_promise.then(function(id) {
  console.log("Object created: "+id);
}, function(message) {
  console.log("Error: "+message);
});

我总是在控制台上获得Object created: Foo。看起来这种转变将被拒绝的承诺变成了一个已经解决的承诺。

有没有办法改变被拒绝的承诺,结果是另一个被拒绝的承诺?

2 个答案:

答案 0 :(得分:3)

  

鉴于我有一个被拒绝的承诺:

var promise = new Promise(function(resolve, reject) {
  reject({error_message: "Foo"});
});

请注意,这应该只读var promise = Promise.reject({error_message: "Foo"}); - 这里不需要涉及复杂的构造函数。

  

我想改变这个承诺

具体来说,您希望映射promise的错误状态。不幸的是,标准承诺中没有这样的方法(例如mapError)。你在代码中做了什么

var new_promise = promise.then(…, function(error) {
  return error.error_message;
});

实际上是为错误设置处理程序,而不是转换。你"赶上"该错误然后返回一个新的结果 - 另见this control flow graph

  

有没有办法改变被拒绝的承诺,结果是另一个被拒绝的承诺?

是的,您需要因处理程序而遭到拒绝。你可以通过

来做到这一点
.then(…, function(error) {
    return Promise.reject(error.error_message);
})

.then(…, function(error) {
    throw error.error_message;
})

(但请注意,frowned upon不要拒绝实际Error个对象的承诺

答案 1 :(得分:1)

而不是:

return error.error_message;

你可以使用:

throw error.error_message;