我想使用JavaScript编写一个函数(使用jQuery,如果你想):如何将异步(基于回调)函数的执行封装到Javascript中的同步函数中?
function fetchItem(itemId) { return /* ??? */; }
此功能依赖于第二,预定义和unmodifyable功能,看起来像这样:
function load(callback) { /* ... */ }
该功能是异步的。调用它后,它通过XHR获取n个项目,然后当它们到达时,将它们存储在DOM中,然后调用回调。
fetchItem
使用简单的jQuery选择器(无关此处)检查元素的DOM与itemId
,并且如果该项目尚不存在,则调用load
。冲洗并重复。
我的问题是,我想的多load
异步调用包装成我的同步fetchItem
功能,这应该与itemId
返回的DOM元素已经赚够了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),这会工作吗?
我可能在这里失去了一个非常好的模式,但我真的不知道谷歌什么...
回调本身创建异步例程的同步不是吗?一件事发生在另一件事之后。 – Orbling 2010-11-25 19:54:04