Лучший подход к этому, чтобы воспользоваться о том, что функции являются объектами первого порядка в JavaScript. Поэтому вы можете назначить их переменным и вызывать их через переменную, изменяя функцию, к которой ссылается переменная по мере необходимости.
Например:
function firstCallback() {
// the first thing has happened
// so when the next thing happens, we want to do stuff
callback = secondCallback;
}
function secondCallback() {
// do stuff now both things have happened
}
var callback = firstCallback;
Если обе ваши части кода теперь использовать переменную для вызова функции:
callback();
, то в зависимости от того один выполняет первый будет вызывать firstCallback, который изменяет переменную чтобы указать на secondCallback, и так будет вызываться в зависимости от того, что выполняет второй.
Однако ваша формулировка вопроса подразумевает, что это может быть ненужным, так как кажется, что вы делаете запрос Ajax, а затем продолжаете обработку. Поскольку интерпретаторы JavaScript являются однопоточными, обратный вызов Ajax никогда не будет выполняться до тех пор, пока основной код кода, который сделал запрос завершенным исполнением, в любом случае, даже если это происходит после получения ответа.
В случае, если это не ваша ситуация, я создал working example on my site; просмотрите источник, чтобы увидеть код (непосредственно перед тегом </body >). Он выполняет запрос, который задерживается сервером на пару секунд, а затем запрос, который получает немедленный ответ. Ответ второго запроса обрабатывается одной функцией, и ответ первого запроса позже обрабатывается другой функцией, так как запрос, который получил ответ, сначала изменил переменную обратного вызова, чтобы ссылаться на вторую функцию.
Поскольку нет никакой реальной многопоточности в JS (пока) это также безопасно. – Jabe
Проблема в том, что один из «потоков» на самом деле не закончен, когда он вызывает функцию callback() из своего контекста. – Thevs
Thevs: Именно поэтому есть счетчик, так что он продолжает выполнение только после того, как закончились оба потока. Обратите внимание, что это не полный ответ и целенаправленно; Я предполагаю некоторый интеллект со стороны искателя, так что они могут заполнить пробелы, но они необходимы. Я просто пытаюсь дать основную идею о том, как решить эту проблему. –