Я пытаюсь написать функцию JavaScript (с JQuery, если вы хотите):Как переносить выполнение асинхронных (callback-based) функций в синхронную функцию в Javascript?
function fetchItem(itemId) { return /* ??? */; }
Эта функция опирается на второй, предопределенной и unmodifyable функции, которая выглядит следующим образом:
function load(callback) { /* ... */ }
Эта функция асинхронна. После его вызова он извлекает n элементов через XHR, а затем, когда они прибыли, сохраняет их в DOM, а затем вызывает обратный вызов.
fetchItem
использует простой селектор JQuery (ненужный здесь), чтобы проверить DOM для элемента с itemId
и вызывает load
если элемент не существует. Промыть и повторить.
Моя проблема заключается в том, что я хочу, чтобы обернуть несколько асинхронных вызовов load
в моей синхронной fetchItem
функции, которая должна возвращать элемент DOM с itemId
после того, как он сделал достаточно load
звонки.
псевдокоде, если load
был синхронным:
function fetchItem(itemId):
while not dom.contains(itemId):
load()
return dom.find(itemId)
Мои первые попытки сделать это в Javascript, который, вероятно, отображать много неправильных представлений о замыканий в JavaScript и модели выполнения:;)
function fetchItem(itemId) {
var match = undefined;
function finder() {
match = $(...).get(0);
if(!match) {
load(finder);
}
}
finder();
return match;
}
Очевидно, что это не удается, поскольку return
выполняется до первого обратного вызова. Кроме того, как вы можете видеть, у меня возникли проблемы с получением match
обратно до fetchItem
. Правильно ли он защищен закрытием здесь? Будет ли это работать, если fetchItem выполнялся несколько раз параллельно, предполагая, что load
поддерживает это (и не смешивает DOM)?
Я, вероятно, отсутствует совершенно хороший образец здесь, но я не знаю, что Google для ...
Обратный вызов сам создает синхронность от асинхронной процедуры, не так ли?Одна вещь происходит за другой. – Orbling 2010-11-25 19:54:04