2016-03-19 3 views
0

Вот общее решение для предотвращения множественных запросов во время действия Ajax.Как предотвратить многочисленные запросы Ajax без введения побочных эффектов

let isRequesting = false 

$('#fetch').on('click',() => { 
    if(isRequesting) { 
     console.log('ajax still in progress, please wait') 
     return false 
    } 

    isRequesting = true 

    $.get(SOME_RESOURCE, (data) => { 
     console.log('success with :', data) 
     isRequesting = false 
    }) 
}) 

Но как я могу закончить эту работу, не меняя состояния в приложении, как это делают функциональные программы.

+0

Лично я обычно отключил кнопку/ссылку в начале события click и включил ее в конце обратного вызова успеха/отказа. Это более понятно пользователям в большинстве случаев. – Obversity

+0

Целью в FP является устранение ненужного состояния и разумное управление необходимым состоянием. В этом конкретном сценарии вы имеете дело с необходимым состоянием - вы хотите, чтобы ваш код функционировал по-разному в зависимости от того, находится ли он в состоянии «готов» или «загружается». – MarkNFI

ответ

0

Вы не можете сделать это, не сохраняя состояние, но вы можете сделать его более красивым, инкапсулируя состояние в общий компонент. Например:

(function($){ 
    $.fn.extend({ 
     smartOn: (type, funcHandler) => { 
      return this.each(function() { 
       let $me = $(this); 
       let isRequesting = false; 
       $me.on(type,() => { 
        if (isRequesting) { 
         console.log('ajax still in progress, please wait'); 
         return false; 
        } 

        isRequesting = true 

        funcHandler(() => { 
         isRequesting = false; 
        }); 
       }); 
      }); 
     } 
    }); 
})(jQuery); 

А потом называют это так:

$('#fetch').smartOn("click", (callbackDone) => { 
    $.get(SOME_RESOURCE, (data) => { 
     console.log('success with :', data) 
     callbackDone(); 
    }) 
}); 

Только не забудьте позвонить callbackDone() в каждом сценарии (то есть также, если $.get не удается). Кроме того, если вы используете Promises вместо обратных вызовов, это может сделать его немного приятным (особенно необходимость обрабатывать каждый сценарий с помощью $.get).

Смежные вопросы