2014-10-02 34 views
1

鉴于我有一个拒绝承诺:在拒绝承诺变换值

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。这种转变似乎将被拒绝的承诺转化为已经解决的承诺。

有没有办法转换被拒绝的承诺,所以结果是另一个拒绝承诺?的

回答

1

代替:

return error.error_message; 

你可以使用:

throw error.error_message; 
2

鉴于我有一个拒绝承诺:

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

声明本应读只是var promise = Promise.reject({error_message: "Foo"}); - 这里不需要复杂的构造函数。

而且我想改变这种承诺

具体来说,要映射在承诺的错误状态。不幸的是,在标准承诺中没有这样的方法(如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对象的承诺)