如何从内部拒绝承诺然后起作用
Posted
技术标签:
【中文标题】如何从内部拒绝承诺然后起作用【英文标题】:How to reject a promise from inside then function 【发布时间】:2014-02-11 04:37:58 【问题描述】:这可能是一个愚蠢的问题,但是在承诺链中间,你如何拒绝来自 then 函数之一的承诺?例如:
someActionThatReturnsAPromise()
.then(function(resource)
return modifyResource(resource)
)
.then(function(modifiedResource)
if (!isValid(modifiedResource))
var validationError = getValidationError(modifiedResource);
// fail promise with validationError
)
.catch(function()
// oh noes
);
不再引用原始解析/拒绝函数或 PromiseResolver。我只是应该添加return Promise.reject(validationError);
吗?
【问题讨论】:
throw validationError
>
您可能正在这里寻找被接受的答案***.com/questions/17800176/…
【参考方案1】:
我只是应该添加
return Promise.reject(validationError);
吗?
是的。但是,it's that complicated 仅在 jQuery 中,使用符合 Promise/A+ 的库,您也可以简单地
throw validationError;
所以你的代码看起来像
someActionThatReturnsAPromise()
.then(modifyResource)
.then(function(modifiedResource)
if (!isValid(modifiedResource))
throw getValidationError(modifiedResource);
// else !
return modifiedResource;
)
.catch(function()
// oh noes
);
【讨论】:
这是常事吗?它被广泛使用吗?这样做我感觉很糟糕,因为如果代码中的某处.catch
丢失,整个应用程序将因未停止的错误而崩溃..
请注意,在符合 Promise/A+ 的库中,您可以使用 throw,因为 handler
的 then
是同步的,并且可以捕获异常。如果处理程序是异步的,它必须返回一个最终拒绝的承诺。所以总是返回 Promise.reject() 而不是 throw 对我来说是有意义的。因为如果你抛出一个异步处理程序,库就无法捕获它,它会默默地通过。当心。
@MikeGleasonjrCouturier:承诺中不应该有不是.then
处理程序的异步处理程序:-) 如果您使用的是未承诺的API,那么即使return Promise.reject()
也会帮助您。
@Bergi 我的意思是:p.then(function() doAsync(function() throw new Error("won't catch"); ); );
编辑:哦,好吧,我重新阅读了您的评论,我完全支持您,我们在同一页上!我想向 OP 指出这一点 :)
@MikeGleasonjrCouturier:是的,这正是我要说的。 doAsync(function() return Promise.reject(new Error("won't catch, won't throw")); )
在那里也不起作用——它只是默默地失败了。当您使用 Promise 时,它确实应该是 doAsync().then(function() throw new Error("will be caught"); )
。以上是关于如何从内部拒绝承诺然后起作用的主要内容,如果未能解决你的问题,请参考以下文章
蓝鸟承诺“promisifyAll”不起作用 - 无法读取属性“then”