如何拒绝来自内部的承诺

chi*_*fet 77 javascript promise

这可能是一个愚蠢的问题,但是中间的承诺链,你如何拒绝来自其中一个函数的承诺呢?例如:

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
    });
Run Code Online (Sandbox Code Playgroud)

不再引用原始的解析/拒绝功能或PromiseResolver.我应该添加return Promise.reject(validationError);吗?

Ber*_*rgi 90

我应该添加return Promise.reject(validationError);吗?

是.然而,它只是在jQuery 中复杂,你可以简单地使用Promise/A +兼容库

throw validationError;
Run Code Online (Sandbox Code Playgroud)

所以你的代码看起来就像

someActionThatReturnsAPromise()
    .then(modifyResource)
    .then(function(modifiedResource) {
        if (!isValid(modifiedResource))
            throw getValidationError(modifiedResource);
        // else !
        return modifiedResource;
    })
    .catch(function() {
        // oh noes
    });
Run Code Online (Sandbox Code Playgroud)

  • 这是正常的事情吗?它被广泛使用吗?我这样做很不好,因为如果代码`.catch`中的某处丢失,整个应用程序将崩溃,并出现错误消息。 (3认同)
  • 请注意,在Promise/A +兼容库中,您可以使用throw,因为`then`的`handler`是同步的,并且可以捕获异常.如果处理程序是异步的,它必须返回一个最终拒绝的承诺.所以总是返回Promise.reject()而不是抛出对我有意义.因为如果你抛出异步处理程序,库就无法捕获它,它将默默地传递.谨防. (2认同)