鉴于我有一个被拒绝的承诺:
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
。看起来这种转变将被拒绝的承诺变成了一个已经解决的承诺。
有没有办法改变被拒绝的承诺,结果是另一个被拒绝的承诺?
答案 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;