【问题标题】: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); 吗?

【问题讨论】:

标签: javascript promise


【解决方案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"); })
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 2020-11-25
  • 2021-05-31
  • 2019-11-25
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多