Javascript 检查Meteor公共目录中是否存在文件

Javascript 检查Meteor公共目录中是否存在文件,javascript,jquery,meteor,Javascript,Jquery,Meteor,当检查app/public目录中是否存在文件时,此Meteor客户端代码无法返回true 在如下所示的浏览器控制台中使用时,它返回undefined utility.isFileExist('http://localhost:3000/abc.gif)或 utility.isFileExist('http://localhost:3000/public/abc.gif) 为什么现在要修复它?谢谢 //client/lib.js utility = (function() { return

当检查app/public目录中是否存在文件时,此Meteor客户端代码无法返回true

在如下所示的浏览器控制台中使用时,它返回
undefined
utility.isFileExist('http://localhost:3000/abc.gif)

utility.isFileExist('http://localhost:3000/public/abc.gif)

为什么现在要修复它?谢谢

//client/lib.js

utility = (function() {
  return {
    isFileExist: (url) => {
      $.get(url)
        .done(function() {
          return true;
        }).fail(function() {
          return false;
        })
    }
  }
})();
根据评论进行编辑 请查看此代码

Template.checks.helpers({
“值”:函数(){
让结果=[];
让checks=Session.get('items');
支票。forEach((项目)=>{
让url=item.replace(/[^0-9a-zA-Z]/g',);

$.get(url+'.giiif')/首先,让我们找出问题所在:

您发布的
实用程序
代码不起作用,因为XHR是异步的,所以在ES5中无法使用同步操作(如赋值)获取其值

围绕定义的生活是多余的。
isFileExist
方法本身不会返回任何内容,如果返回了,则将是请求的jqXHR对象,该对象不会在调用时提供您正在查找的数据

另一个问题是Meteor通常会使用页面的HTML来响应任何未专门绑定到另一个响应的URL。这意味着该请求在技术上会成功(200个OK响应代码,而不是您可能期望的响应),因此在这种情况下也不会调用
fail
回调

使用response
content-type
标题可以合理地确定结果是文件还是HTML文档

您可以执行以下操作:

实用程序={
doesFileExist(名称,cb){
$.get(name).done(数据、状态、请求)=>{
const isHtml=request.getResponseHeader('content-type')=='text/html;charset=utf-8';
cb(!isHtml);
})
}
};
//用文件名和回调函数调用它
utility.doesFileExist('foo.png',(doesExist)=>{
如果(!性别歧视){
//如果文件不存在,请执行某些操作
}
});
它将独立工作,但不允许您在模板帮助程序中使用它。您可以使用跟踪请求状态的
ReactiveDict
,但这会增加代码的复杂性

另一个缺点是,对于要检查的每个文件,您都需要额外的时间来调用服务器


一些替代方案 每个
标记都应该具有
alt
属性。如果缺少图像,则会显示
alt
文本,但这不是很美观

幸运的是,
img
标记有一个
error
事件被触发,以防无法加载图像,因此您可以使用它隐藏图像或执行其他操作

Template.foo.events({
“错误img”:函数(e){
$(e.target).hide();//或其他内容
}
});
另一方面,您应该知道
public
文件夹中存在哪些图像,因为它们是静态复制的,并在编译时提供


重要的是要解释你想在问题中完成什么,而不仅仅是问“我怎么做XY?”(因为答案的第一部分在你的情况下不是很有用)。

你不能逃避XHR是异步的,即使你用更多的语法糖和(不必要的)IIFE围绕它。你需要某种回调来处理答案(或者使用async/wait并将其编译成ES5)。@MasterAM请给出一个例子。在你的代码中,如果你想使用jQuery(Meteor也有一个HTTP包),你应该在
done | fail
(或者使用
总是
)回调中继续逻辑流。你将无法立即得到结果(或使用同步语法)与ES5。@MasterAM我根据您的建议编辑了问题。为什么我会启动
完成
,但
失败
并不存在,即使文件不存在?最有可能的原因是Meteor会以代码200和HTML内容响应任何未设置为专门响应的URL。