Я пытаюсь написать функцию в Javascript (с jQuery, если хотите):
function fetchItem(itemId) { return /* ??? */; }
Эта функция опирается на вторую, предопределенную и неизменяемую функцию, которая выглядит следующим образом:
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 ...