2015-03-09 2 views
0

Могу ли я сделать запрос AJAX в расширении Chrome для запуска только после того, как все остальные запросы AJAX на странице завершены? У меня есть функция, которая изменяет элементы страницы, но она может работать только после того, как все остальные JS запущены.Порядок управления запросами AJAX

Прямо сейчас, я использую $(document).click(func);, чтобы вызвать мою функцию, но я думаю, что для этого будет лучший способ.

+0

* «только после того, как все другие запросы AJAX на странице завершения» * - Как он может предсказать, может ли страница сделать другой запрос Ajax позже, возможно, в ответ на событие пользователя или таймера? (Это не может быть.) – nnnnnn

+0

Вы управляете всеми другими вызовами AJAX? – unobf

+1

@unobf, нет, они предоставляются сайтом. – fossilet

ответ

-1

Вы можете проверить async.js взять под свой контроль потока: https://github.com/caolan/async

Или, если вы, вероятно, сделать что-то вроде себя, вы можете реализовать что-то вроде этого:

var totalRequestCount = 10; // You may apply your own count here. 
var executedRequestCount = 0; 

И внедрить каждый метод обратного вызова, подобный этому

var callback = function() { 
    executedRequestCount ++; 
    if (totalRequestsCount === executedRequestsCount) { 
    // put the last request here 
    } 
}; 

PS Я думаю, что должны быть некоторые другие способы оптимизации жизненного цикла всей страницы.

+0

Не полезно, как написано: запросы выполняются в коде страницы, который не контролируется расширением. Для этого OP необходимо будет ввести код на страницу, чтобы захватить все механизмы AJAX. – Xan

0

Если вы можете предсказать, какие элементы будут вставлены на страницу, вы можете использовать mutationObserver для просмотра всех ожидаемых изменений, а затем, когда все это произошло, запустите свой код.

https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

Некоторый код может выглядеть следующим образом:

(function() { 
    var expectedMutations = [...]; // put your expected mutations in here + some way to track if they have been seen 

    // create an observer instance 
    var observer = new MutationObserver(function(mutations) { 
     mutations.forEach(function(mutation) { 
     // if the mutation matches do something 
     }); 
     if (all mutations matched) { 
     // disconnect the observer 
     observer.disconnect(); 
     // do AJAX call 
     } 
    }); 

    // configuration of the observer: 
    var config = { attributes: true, childList: true, characterData: true }; 

    // pass in the target node, as well as the observer options 
    observer.observe(document.body, config); 
}()); 

Примечание это не работает в старых браузерах, есть старые мутации смотреть API, если вам необходимо поддерживать старые браузеры. Вот список, который поддерживает его

https://code.google.com/p/mutation-summary/wiki/DOMMutationObservers#Browser_Availability

А вот старшее API базируется на слушателей событий

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events

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