【问题标题】:JQuery deferred reject immediatelyjQuery延迟拒绝立即
【发布时间】:2014-02-02 10:03:31
【问题描述】:

使用 JQuery.Deferred 时可以直接调用 reject() 吗?没有调用异步函数?

也许我想在我的异步函数开始时进行某种测试。如果测试失败,我想立即拒绝。请参阅下面的第一个 if 块。

function doSomethingAsync() {

    //Test if the ajax call should be invoked
    var testFailed = true;

    var dfd = $.Deferred();

    //Check if test failed
    if (testFailed) {
        var asyncResult = {
            success: false,
            data: 'test failed'
        };

        //Is this OK usage of reject on the same thread?
        dfd.reject(asyncResult);

        return dfd.promise();
    }


    $.get('/api/testapi/get').done(function (data) {
        var asyncResult = {
            success: true,
            data: data
        };

        dfd.resolve(asyncResult);
    }).fail(function (err) {
        var asyncResult = {
            success: false,
            data: err
        };

        dfd.reject(asyncResult);
    });

    return dfd.promise();
}

【问题讨论】:

  • 是的,当您想拒绝时,可以拨打reject。事实上,这也是这种方法存在的一个原因。您仍然希望您的 doSomethingAsync 返回承诺对象,因此您的方法是可以的。在这种情况下,doSomethingAsync().fail(callback) 将始终按预期工作。
  • @dfsq 您不想对答案发表评论吗? :)
  • 谢谢。我想我不知道/理解 Deferred 对象是如何工作的。在返回承诺之前调用拒绝似乎很奇怪,但我可以 =)

标签: javascript jquery jquery-deferred


【解决方案1】:

使用 JQuery.Deferred 时可以直接调用 reject() 吗?没有调用异步函数?

是的,返回一个已经被拒绝的承诺并立即拒绝延迟是完全可以的。您可能只需要验证您的回调不依赖于异步解析,jQuery 不能保证这一点(与 A+ implementations 相比)。

请注意,在您的代码中您应该使用then 而不是手动解析延迟:

function doSomethingAsync() {

    var testFailed = /* Test if the ajax call should be invoked */;

    var dfd = testFailed 
          ? $.Deferred().reject('test failed')
          : $.get('/api/testapi/get');

    return dfd.then(function (data) {
        return {
            success: true,
            data: data
        };
    }, function (err) {
        return {
            success: false,
            data: err
        };
    });
}

【讨论】:

  • 感谢有关使用 then 的提示。在哪些情况下我会手动解决延期?当没有另一个承诺像使用 window.setTimeout 的自定义异步方法一样使用时?
  • 是的,完全正确。或者当您需要突然创建一个承诺时,就像我们为test failed-rejection 所做的那样。但是当你已经有一个承诺时(比如来自$.ajax 的承诺),你应该总是使用then - 错误处理程序、通知、隐式参数将被自动处理并且不会被遗忘。
【解决方案2】:

您可以快速完成,因为您的函数返回一个 Promise 对象:

return Promise.reject('test failed');

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多