转换被拒绝的承诺中的值

Transform values in a rejected promise

本文关键字:承诺 转换 拒绝      更新时间:2023-09-26

假设我有一个被拒绝的承诺:

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。这种转变似乎将被拒绝的承诺变成了坚定的承诺。

有没有一种方法可以转换一个被拒绝的承诺,这样结果就是另一个被拒绝的承诺?

假设我有一个被拒绝的承诺:

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

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

我想改变的承诺

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

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

实际上是为错误设置处理程序,而不是转换。您"捕获"错误,然后返回一个新的结果-另请参阅此控制流程图。

有没有一种方法可以转换一个被拒绝的承诺,这样结果就是另一个被拒的承诺?

是的,你需要得到拒绝作为你的处理者的结果。你可以通过

.then(…, function(error) {
    return Promise.reject(error.error_message);
})

或通过

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

(但是,请注意,不拒绝带有实际Error对象的承诺是不可取的)

而不是:

return error.error_message;

你可以使用:

throw error.error_message;