2017-01-30 6 views
0

У меня проблема с $.ajax, $.when и apply. У меня есть конструктор: запрос Аякса не срабатывает, когда он должен быть: http://plnkr.co/edit/Ul9d8tB7BHoZyHzzQQyB?p=preview (см консоль)

function updateGeneralTerm() { 
    return { 
    id: "GeneralCondition", 
    ajax: function() { 
     return $.ajax({ 
     type: 'POST', 
     url: "@Url.Action("UpdateGeneralTerms", "Agreements")", 
     data: $("#GeneralConditions").serialize() 
     }) 
    } 
    } 
} 

//I inject it in my custom function   
function CustomFunction(arr) { 
    let arrOfAjax = arr.map(function (obj) { 
    return obj.ajax 
    }); 
    $.when.apply(null, arrOfAjax); 
} 

CustomFunction([new updateGeneralTerm()]; 

В моей CustomFunction, я проверяю другие вещи, как это делает изменилась форма .. и т. д. Однако это не похоже на мою проблему. Ничего не произошло.

В будущем у меня может быть определенный термин, который я бы хотел обновить, только если формы были изменены.

Моя проблема: ajax не запрашивается $ .when(). Если я перехожу к возврату obj.ajax(), запрос ajax запускается там напрямую не $ .when(). Мне бы хотелось $ .when() обрабатывать все запросы ajax.

http://plnkr.co/edit/Ul9d8tB7BHoZyHzzQQyB?p=preview

+0

Это потому, что вы используете ссылку в '' AJAX) функции (. Вы на самом деле не называете это. Попробуйте использовать 'return obj.ajax();'. Немного странно, как вы доказываете объект, возвращенный из 'updateGeneralTerm()' в 'CustomFunction()' внутри массива. Предположительно, это потому, что в вашем производственном коде у вас будет предварительно заполненный массив ...? –

+0

@RoryMcCrossan => не работает. Если я делаю obj.ajax(), активируется $ .ajax() ... Я уверен, потому что я прокомментировал $ .when (...), и он достиг метода контроллера. – Stefdelec

+0

'Если я делаю obj.ajax(), активируется $ .ajax(). Это то, что я предложил, и чего вы пытаетесь достичь, не так ли? Также дайте больше информации, чем просто «это не работает». Что не работает? Где это не удается? Вы проверили наличие ошибок в консоли или вкладке сети, чтобы увидеть ответный текст? –

ответ

1

пытаются переписать CustomFunction функцию использовать spread оператора:

function CustomFunction(arr) { 
    let arrOfAjax = arr.map(function (obj) { 
    return obj.ajax 
    }); 
    $.when(...arrOfAjax).then(function(...results) { 
    console.log(results); 
    }); 
} 
+0

извините, не могу проверить сейчас, проверит позже сегодня вечером ... – Andriy

+0

На самом деле это работает. Я испортил свой разум! Поэтому нет необходимости проверять его. Спасибо. Однако он должен работать с «.apply», но я не пойду глубже в проблема! Спасибо! – Stefdelec

+0

'apply' использовался для того, чтобы передать' $ .when' функцию любое количество обещаний в виде массива, потому что '$ .when' ожидает обещания s, разделенные аргументами функции запятой ($ .when (d1, d2, d3) .done (функция (v1, v2, v3) ...). Оператор 'spread' позволяет нам передавать аргумент как один массив, но получаемый функцией как разделенный запятыми аргументами, поэтому не нужно« применять », если мы используем' spread' (три точки) – Andriy