JQuery立即推迟拒绝

问题描述 投票:9回答:2

使用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();
}
javascript jquery jquery-deferred
2个回答
11
投票

使用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
        };
    });
}

0
投票

您可以快速完成此操作,因为函数将返回Promise对象:

return Promise.reject('test failed');
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.