Понимание отложенного jQuery.pipe()

#jquery #deferred-execution #deferred-loading

#jquery #отложенное выполнение #отложенная загрузка

Вопрос:

Я пытаюсь реализовать метод jQuery Deferred.pipe() для следующего сценария:

  1. Добавьте пользователя в базу данных с помощью $.ajax()
  2. Получите ответ, был ли пользователь добавлен правильно или нет.
  3. В случае успешного добавления получите весь список пользователей с сервера через $.ajax()
  4. Отображение списка с помощью шаблонов jQuery

Это то, что я пробовал:

 var addUserSuccess = function( data ) {
    if ( data.returnCode !== "success" ) {
        return $.Deferred().reject('Error saving user');
    }
    getUsers();
}

var addUser = function() {
    return $.ajax(url, {
        type: "POST",
        data: { username: 'test' },
        contentType: "application/json",
        dataType: "json"
    });
}

var displayUsers = function( data ) {
    $('#myTmpl').tmpl(data.d).appendTo('#myDiv');
}

var getUsers = function () {
    return $.ajax(url, {
        type: "GET",
        data: {},
        contentType: "application/json",
        dataType: "json"
    });
}

$.when(addUser()).pipe(addUserSuccess).then(displayUsers)
  

Но это не работает. Я знаю, что чего-то не хватает или неправильно. Любая помощь?

Ответ №1:

В addUsersSuccess вы должны возвращать getUsers. Это простая опечатка, вы совершенно правильно поняли основную идею и используете pipe так, как это должно быть, и красиво 🙂

Комментарии:

1. Спасибо за ответ и подтверждение о коде. Однако, просто хотел подтвердить, можем ли мы вызвать этот код в цепочке, что-то, где мы можем объединить все запросы и обратные вызовы в одну инструкцию. Что-то вроде: $.when(ajaxreq1).pipe(ajaxreq2).then(successcallback1).then(successcallback2) Таким образом, мы узнаем из одной инструкции все запросы и обратные вызовы.

2. @Ashish: да, обещания и отсрочки полностью можно объединить в цепочку. Вы могли бы создать событие $.when(…).pipe(…).done(cb1).pipe(…).done(cb2), все возможно 😉

3. Я пробовал что-то вроде этого http://jsfiddle.net/8AtbP/2 / . Но не работает.