车把和异步调用
Handlebars and async call
我使用此助手来检查图像是否存在:
Handlebars.registerHelper('checkLogo', function(url) {
UrlExists(url, function(status){
if(status === 200){
return new Handlebars.SafeString(url)
}
else if(status === 404){
console.log('no logo found');
}
});
});
function UrlExists(url, cb){
$.ajax({
url: url,
dataType: 'text',
type: 'GET',
complete: function(xhr){
if(typeof cb === 'function')
cb.apply(this, [xhr.status]);
}
});
}
我在我的模板中称它为(将 url 作为 arg),如下所示:
<img src="{{checkLogo logo}}"/>
我希望{{checkLogo logo}}
被 url 替换,但没有任何返回。可能是因为异步操作,因此必须以不同的方式处理吗?
谢谢
尽管 Handlebars 不支持异步帮助程序,但您仍然可以使用帮助程序来实现此目的。使用助手创建一些独特的 html,并使用 MutationObserver 检测它被添加到 DOM 中。然后,您可以掌握添加的img
元素并根据需要对其进行修改。
一个更简单、更有效的解决方案是使用 img
元素的 onerror
属性来触发一些回调。下面是一个小提琴示例。另一个使用车把模板的小提琴。
如果你想探索Handlebars + MutationObserver的方式,我创建了一个你可以使用或适应的助手。它可以在 https://github.com/ekuusela/post-render-bars 获得,并在这个小提琴中演示。
watch.js 定义了一个函数forHtml(html, callback)
当在 DOM 中遇到给定的 HTML 时,该函数会触发回调。它修改 html 以暂时拥有一个使其唯一的类。
帮助程序.js定义帮助程序renderer
和函数createRenderer(getHtmlContentFn)
,函数将函数包装到呈现器中,并且可以传入模板并用作帮助程序的参数。
我也想要这个,找到了一种方法:
Handlebars.registerHelper('myHelperFunctionName', function (item) {
var element_id = 'temp-prefix-' + item, item_html = false;
// make async call here:
SlowAsyncCallbackPromiseThing(item, function(item_object){
item_html = Handlebars.templates.item(item_object);
$('span#' + element_id).replaceWith(item_html);
});
if(item_html){//cache resolved immediately
return new Handlebars.SafeString(item_html);
}
// If the cache is barren, provide a loading span to be replaced later.
return new Handlebars.SafeString('<span id="' + element_id + '">Loading..</span>');
});
现在,当你加载它时,内部jQuery只是在最终解析时替换临时元素......不是最好的,但它很快并且可以与Handlebars一起使用。我使用了很多本地存储缓存,因此一些承诺会立即解决。绝对头痛的故障排除,直到我弄清楚为什么它并不总是工作。
要使其适应元素的属性......并不难,但你需要某种方法来识别元素。
- jasmine 2-在jasmine指定的超时时间内未调用异步回调.DEFAULT_TIMEOUT_INTERVAL
- 递归调用异步函数
- Fine Uploader S3-无处安全调用异步“;setUploadSuccessParams()"
- 调用异步函数的循环
- 从视图调用异步加载模块函数
- 在循环中调用异步函数
- JavaScript ES6 承诺在 while 循环中调用异步操作
- 并行调用异步/等待函数
- 解析云代码:如何调用异步保存的承诺
- 量角器根据条件单击嵌套元素,错误 - 在指定的超时内未调用异步回调
- 反应组件调用了两次(AJAX调用异步)
- 使用 ajax 调用异步 Web api 方法
- NodeJS:调用异步函数时谁做异步工作
- 调用异步函数 befrore 服务器开始侦听
- Node JS 动态集合 ajax 调用异步等待
- 页面重定向后调用异步成功函数
- 如何在调用异步Web服务响应时将值设置为数组
- 如何在node.js可读流中调用异步函数
- 在nodejs中,是否有更好的设计模式来同步调用异步函数
- 同步调用异步 JavaScript 函数