如何从内部拒绝承诺然后起作用

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,因为 handlerthen 是同步的,并且可以捕获异常。如果处理程序是异步的,它必须返回一个最终拒绝的承诺。所以总是返回 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”

更新视图未显示的范围变量。承诺不起作用

如何同步 Promise 对象?

从 Google PubSub 中提取消息不起作用 - 权限被拒绝

承诺`终于'不起作用

$.when 承诺对象不起作用[重复]