2014-10-10 3 views
0

Здесь у меня есть две JS-асинхронные функции, запущенные одновременно.Остановить ожидающую функцию async в JavaScript

Когда кто-то закончил (callback был запущен), я хотел бы остановить другого, чтобы идти вперед. Однако (это моя проблема) Я не могу использовать глобальные vars. Тогда я хотел бы знать, можно ли остановить ожидающую функцию в JS или каким-либо образом решить мою проблему.

Я признателен за любые ответы :)

EDIT:

Некоторые уточнений:

  • Я здесь с использованием чистых JS. HTML не предоставлен.
  • Когда я говорю об асинхронном, это может быть любая асинхронная функция, а не только ajax (база данных, время ожидания и т. Д.).
  • Мы не знаем их время выполнения.

О коде, вот пример того, что я хотел бы произвести:

asyncFirst(
    // ... args 
    function() { // callback 
     console.log('foo'); 
     stopOther(); 
    } 
); 

asyncSecond(
    // ... args 
    function() { // callback 
     console.log('bar'); 
     stopOther(); 
    } 
); 

asyncFirst(...); 
asyncSecond(...); 

Какой алгоритм для stopOther() без использования «состояние» Варс?

+5

Что у вас есть, до сих пор? – laruiss

+0

Они работают в одном и том же локальном пространстве? Вам нужно пройти весь путь до глобального, чтобы установить переменную флага? Это поможет увидеть код. –

+0

Используйте _IIFE_ как предок этого раздела кода для создания замыкания, которое позволит вам обмениваться переменными между функциями без загрязнения глобального пространства имен. –

ответ

0

К сожалению, нет способа остановить асинхронный метод работы без использования 'state' var. После вызова метод нельзя остановить, даже используя очень «низкоуровневые» методы JS.

Для «state» var, пожалуйста, проверьте ответ Джареда Смита.

-2

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

1) положить что-то в скрытом поле и проверить это значение.

2) сделайте вызов ajax для проверки сервера сервера флагов.

это единственное, что я вижу.

+0

Нет необходимости в таких хаках. JavaScript имеет локальные (частные) переменные. –

+0

Это смешно. Существует множество других способов в зависимости от того, в какой области присутствуют обратные вызовы, какие сторонние библиотеки (если есть) используются и т. Д. Не нужно бросать ядерную бомбу на муравейник. –

+0

Я согласен, но он указал, что он не может использовать глобальный var, поэтому я решил, что решение использовать javascript-переменную клиентскую сторону исключает –

0

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

var flag = false; 
function async1() { 
    //check if other function is done 
    if (!flag) { 
     //do stuff 
    } 
    flag = true; 
} 

function async2() { 
    //same structure as the first 
} 

Если они работают в глобальной области вам нужно будет использовать предложение Пола С. IIFE

(function() { 
    var flag = false; 
    function async1() { 
     //check if other function is done, if it is don't bother 
     if (!flag) { 
      //do stuff 
     } 
     flag = true; 
    } 
    function async2() { 
     //ditto 
    } 
})(); 

Это предотвратит загрязнение глобального пространства имен. Обратите внимание, что javascript является однопоточным. Здесь вы здесь, потому что две функции не могут поражать флаг в одно и то же время, только один из них действительно внесет изменения. Также обратите внимание, что async1 & & 2 не обязательно должны быть определены в той же области, но flag должны будут существовать в области, из которой они вызываются.

+0

С флагом, я бы сделал тот же метод, что и ваш :) Но моя проблема заключается в том, чтобы делать то же самое без этого вид вар. –

+0

Вы упомянули, что не можете использовать глобальный var. Во втором примере флаг 'flag' не является глобальным, он является локальным для анонимной функции, которая вызывается сразу после объявления. Не знаете, почему это не сработает для вас, есть ли причина, кроме глобального загрязнения пространства имен, вы не можете использовать флаг? –

+0

Извините, я не понял. Я имел в виду использование флага var, как вы объяснили. На самом деле, я не знаю, когда будет запускаться асинхронный обратный вызов. В моем алгоритме я мог использовать флаг так же, как и вы, но пока что функция async закончилась, флаг можно было сбросить или отредактировать. Тогда я ничего не могу для этого принять. Вот почему я ищу альтернативу. –

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