JQuery отложено отклонить немедленно

при использовании JQuery.Отложено можно ли вызвать reject () напрямую? Без необходимости вызывается функция async?

возможно, мне нужен какой-то тест в начале моей асинхронной функции. Если тест не удастся, я хочу немедленно отказаться. См. первый блок 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();
}

1 ответов


при использовании JQuery.Отложено можно ли вызвать reject () напрямую? Без необходимости вызывается функция async?

Да, это совершенно нормально, чтобы вернуть уже отвергнутое обещание и немедленно отклонить отсрочки. Вам может потребоваться только убедиться, что ваши обратные вызовы не зависят от асинхронного разрешения, которое jQuery не гарантирует (в отличие от а+ реализации).

обратите внимание, что в вашем коде, вы должны использовать 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
        };
    });
}