【发布时间】:2017-05-06 09:30:51
【问题描述】:
我无法捕捉到 Resolve 承诺中发生的异常/错误。 有人可以解释一下是否有办法捕捉到这个错误:
createAsync = function() {
var resolve, reject,
promise = new Promise(function(res, rej) {
resolve = res;
reject = rej;
});
promise.resolve = resolve;
promise.reject = reject;
return promise;
};
promise = createAsync()
promise.then(function myresolver(){
throw Error('wow')
})
// Catching the error here
try {
promise.resolve()
} catch(err) {
console.log( 'GOTCHA!!', err );
}
编辑:
让我更好地解释一下,我正在尝试创建一个 API,而用户只能访问 promise resolve/reject 部分:
// This is my API user does not have access to this part
promise = createAsync()
promise
.then(function(fun) {
if (typeof fun != 'function')
throw Error('You must resolve a function as argument')
}).catch(function(err){
// Some internal api tasks...
return Promise.reject(err)
})
现在我想给他解决方案,但不起作用:
// Here is where the user can resolve the promise.
// But must be able to catch the error
promise.catch(function(err){
console.log("GOTCHA", err)
})
promise.resolve('This must be a function but is a string');
有什么想法吗?
更多信息: Yes 是常见用法的反模式。这是一个远程过程调用 API,因此用户必须能够拒绝或解决。而且调用是异步的,所以最好的方法是使用 Promise。我不会说这种情况下的反模式。实际上是唯一的模式。 (我不能使用 Async/Await)
【问题讨论】:
-
// Catching the error here不,你不是 - 你promise.resolve()不会拒绝承诺......你的promise.then ... throw将“拒绝”那个承诺(由.then 返回的那个)而不是promise中的一个 -
“导出”提供给执行程序的
resolve和reject函数(传递给 promise 构造函数的函数),在您的情况下,通过使用其他属性污染 promise 对象,是一种反图案。 Promise 构造函数设计的全部要点是解析和拒绝在执行器内部是隔离的。您的方法允许任何碰巧获得您的承诺对象之一的随机人解决或拒绝它,这几乎肯定不是好的程序设计。 -
@EnZo torazaburo 是对的,您应该始终将解析能力与承诺分开。通常你不希望用户调用
resolve或reject- 更好的承诺模式是简单地接受用户的承诺,他可以自行解决/拒绝。 -
“用户”坐在 RPC 的哪一侧?如果您可以显示实际代码(一些 API 对象?)而不是
createAsync伪代码,这可能会有所帮助。 -
哦,你是对的,真正的代码是复杂的。不幸的是,我无法弄清楚
f中的localProcedureCall是什么以及它如何使用/需要使用req对象。但是,我可以告诉你localProcedureCall不应该接受resolve和reject回调,而是 return 一个承诺(你可能是 want to use.then(…, …)instead of.then(…).catch(…)),并且dop.protocol.subscribe的模式基本上应该看起来像return new Promise(resolve => storeRequest(node, request_info, resolve); })
标签: javascript promise