【发布时间】:2018-02-04 00:32:57
【问题描述】:
我有这段调用 java 后端的 ES6 代码。 java 后端通常返回状态码 200 和 json 有效负载,但有时会返回状态码 500 和 json 有效负载。对于 200,我想反序列化 json 并将生成的对象传递到 promise 链上。对于 500,我想反序列化 json 并将生成的对象 throw 提交到 promise 链上,即让它命中 catch 块。
以下代码几乎可以满足我的要求:
invoke(className, methodName, args) {
return this.httpClient
.fetch('/api/' + className + "/" + methodName,
{
method: 'POST',
body: json(args)
})
.catch(response => {
// Function A
throw response.json();
})
.then(response => {
// Function B
return response.json();
});
}
this.invoke("TestService", "testMethod", {a: 1, b: 2})
.then(response => {
// Function C
console.log(response); // prints the actual json object which I expect
}).catch(response => {
// Function D
console.log(response); // prints: [object Promise]
});
- 函数 A 被调用 500。很好。
- 函数 B 被调用 200。很好。
- response.json() 在 A 和 B 中返回一个反序列化对象的承诺。很好。
- 函数 A 导致调用函数 D。很好。
- 函数 B 导致调用函数 C。很好。
- 函数 C 的参数响应是反序列化的对象。很好。
- 但是,函数 D 中的参数 response 不是反序列化对象,而是反序列化对象的承诺。
我已经为此工作了一段时间,但我无法向谷歌解释我的问题是什么。
问题:为什么返回一个promise会“解开”下一个函数的promise,而抛出一个promise会将promise本身传递给下一个函数?
有什么方法可以实现我想要的,即让函数 D 像函数 C 一样获取“解包”对象?
【问题讨论】:
-
Eeeck gad。兑现承诺?这样做的真实原因是什么?你抛出一个拒绝原因,而不是未来的异步操作。
标签: promise es6-promise