- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
J是一个具有各种功能的对象。
当 g、m 和 c 在窗口中完全加载时(对于 Web 和移动设备),函数 u、t 和 z 应该运行,这需要几毫秒的服务器响应时间。
替代 setTimeout 函数(800 毫秒)的最快或最佳方法是什么?
感谢一百万,
中号
J.o({p:'/dir/file-1.txt'});
J.e({
g:'/dir/file-2.txt',
m:'/dir/prefix-',
c:'/dir/prefix-string.txt'
}); // a function that gets a few files with texts or JSON objects
setTimeout(function(){
J.u({g: window['g'],m: window['m'],c: window['c']}); // a function to be run after loading three JSON objects in window
J.t(window['p'],{t:"two"}); // a function to be run after loading another large JSON object
J.z({});
}, 800);
// J.o function
o:function(z){
var g,h,x=[];
Object.keys(z).forEach(function(a,b,c){
window[a]=null;
x[b]=new XMLHttpRequest();
url=window.location.origin.concat('/',z[a.toString()]);
x[b].open("GET",url,true);
x[b].onreadystatechange=function (z){
if(x[b].readyState===4){
if(x[b].status===200 || x[b].status==0){
window[a]=x[b].responseText;
}
}
}
x[b].send();
});
}
// J.e function for styles
e:function(z){
var w,y,e,ar,x=[];
Object.keys(z).forEach(function(a,b,c){
window[a]=null;
x[a]=new XMLHttpRequest();
if(a=='m'){
w=window.innerWidth; /*window size*/
switch(true) {
case(w<200):
window.y='a1';window.e=0.8; /*tiny*/
break;
case(w>=200&&w<=360):
window.y='a2';window.e=0.9;/*x small*/
break;
case(w>360&&w<=480):
window.y='a3';window.e=1; /*small*/
break;
case(w>480&&w<=768):
window.y='a4';window.e=1.1; /*medium*/
break;
case(w>768&&w<=1280):
window.y='a5';window.e=1.3; /*large*/
break;
case(w>1280&&w<=1920):
window.y='a6';window.e=1.6; /*x large*/
break;
case(w>1920):
window.y='a7';window.e=1.9; /*xx large*/
break;
default:
window.y='a5';window.e=1.2; /*default size */
break;
}
url=window.location.origin.concat('/',z[a.toString()],window.y,'.txt');
} else {
url=window.location.origin.concat('/',z[a.toString()]);
}
x[a].open("GET",url,true);
x[a].onreadystatechange=function (z){
if(x[a].readyState===4){
if(x[a].status===200 || x[a].status==0){
window[a]=x[a].responseText;
}
}
}
x[a].send();
});
}
最佳答案
使用 Promises 代替,然后您可以使用 Promise.all
,当传递的数组中的所有 Promise 都得到解析时,它将解析。不再使用 forEach
遍历传递对象的 keys
,而是 .map
将每个键映射到 Promise:
const getProm = (url) => new Promise((resolve, reject) => {
const x = new XMLHttpRequest();
x.open("GET", url, true);
x.onreadystatechange = function() {
if (x.readyState === 4) {
if (x.status === 200 || x.status == 0) {
resolve(x.responseText);
} else {
reject(x.status);
}
}
}
});
// J.o function
o: function(z) {
var g, h, x = [];
const proms = Object.keys(z).map(function(a, b, c) {
window[a] = null;
x[b] = new XMLHttpRequest();
const url = window.location.origin.concat('/', z[a.toString()]);
return getProm(url)
.then((responseText) => {
window[a] = responseText;
});
});
return Promise.all(proms);
}
// J.e function for styles
e: function(z) {
var w, y, e, ar, x = [];
const proms = Object.keys(z).map(function(a, b, c) {
window[a] = null;
if (a == 'm') {
w = window.innerWidth; /*window size*/
switch (true) {
case (w < 200):
window.y = 'a1';
window.e = 0.8; /*tiny*/
break;
case (w >= 200 && w <= 360):
window.y = 'a2';
window.e = 0.9; /*x small*/
break;
case (w > 360 && w <= 480):
window.y = 'a3';
window.e = 1; /*small*/
break;
case (w > 480 && w <= 768):
window.y = 'a4';
window.e = 1.1; /*medium*/
break;
case (w > 768 && w <= 1280):
window.y = 'a5';
window.e = 1.3; /*large*/
break;
case (w > 1280 && w <= 1920):
window.y = 'a6';
window.e = 1.6; /*x large*/
break;
case (w > 1920):
window.y = 'a7';
window.e = 1.9; /*xx large*/
break;
default:
window.y = 'a5';
window.e = 1.2; /*default size */
break;
}
url = window.location.origin.concat('/', z[a.toString()], window.y, '.txt');
} else {
url = window.location.origin.concat('/', z[a.toString()]);
}
return getProm(url)
.then((responseText) => {
window[a] = responseText;
});
});
return Promise.all(proms);
}
然后,您可以在 J.o
和 J.e
的调用上调用 Promise.all
:
Promise.all([
J.o({p:'/dir/file-1.txt'}),
J.e({
g:'/dir/file-2.txt',
m:'/dir/prefix-',
c:'/dir/prefix-string.txt'
})
]).then(() => {
console.log('All requests have finished');
})
.catch((e) => {
// handle errors
});
请注意,如果您可以设法切换到 fetch
而不是 XMLHttpRequest
- fetch
返回一个 Promise
已经存在,因此无需使用它显式构造 Promise
:
const getProm = url => fetch(url).then((res => res.text());
但它在古代浏览器中不受支持,因此要可靠地使用它,您还需要一个填充。
如果您分配给 window[a]
的唯一原因是为了稍后能够访问异步返回的值,请不要使用 Promises 解析到的值。例如:
Promise.all([
getProm('foo'),
getProm('bar')
])
.then(([foo, bar]) => {
// foo and bar are variables which hold the response text for foo and bar
});
顺便说一句,您可能会强烈考虑仅调试和更改源代码,而不是缩小的代码。缩小的代码读起来很痛苦。
关于javascript - 窗口完全加载的 setTimeout 的最佳替代是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54140401/
我想要显示正在加载的 .gif,直到所有内容都已加载,包括嵌入的 iframe。但是,目前加载 gif 会在除 iframe 之外的所有内容都已加载后消失。我怎样才能让它等到 iframe 也加载完毕
首先,这是我第一次接触 Angular。 我想要实现的是,我有一个通知列表,我必须以某种方式限制 limitTo,因此元素被限制为三个,在我单击按钮后,其余的应该加载。 我不明白该怎么做: 设置“ V
我正在尝试在我的设备上运行这个非常简单的应用程序(使用 map API V2),并且出于某种原因尝试使用 MapView 时: 使用 java 文件: public class MainMap e
我正在使用 Python 2.6、Excel 2007 Professional 和最新版本的 PyXLL。在 PyXLL 中加载具有 import scipy 抛出异常,模块未加载。有没有人能够在
我想做这个: 创建并打包原始游戏。然后我想根据原始游戏中的蓝图创建具有新网格/声音/动画和蓝图的其他 PAK 文件。原始游戏不应该知道有关其他网格/动画/等的任何信息。因此,我需要在原始游戏中使用 A
**摘要:**在java项目中经常会使用到配置文件,这里就介绍几种加载配置文件的方法。 本文分享自华为云社区《【Java】读取/加载 properties配置文件的几种方法》,作者:Copy工程师。
在 Groovy 脚本中是否可以执行条件导入语句? if (test){ import this.package.class } else { import that.package.
我正在使用 NVidia 视觉分析器(来自 CUDA 5.0 beta 版本的基于 eclipse 的版本)和 Fermi 板,我不了解其中两个性能指标: 全局加载/存储效率表示实际内存事务数与请求事
有没有办法在通过 routeProvider 加载特定 View 时清除 Angular JS 存储的历史记录? ? 我正在使用 Angular 创建一个公共(public)安装,并且历史会积累很多,
使用 Xcode 4.2,在我的应用程序中, View 加载由 segue 事件触发。 在 View Controller 中首先调用什么方法? -(void) viewWillAppear:(BOO
我在某些Django模型中使用JSONField,并希望将此数据从Oracle迁移到Postgres。 到目前为止,当使用Django的dumpdata和loaddata命令时,我仍然没有运气来保持J
创建 Nib 时,我需要创建两种类型:WindowNib 或 ViewNib。我看到的区别是,窗口 Nib 有一个窗口和一个 View 。 如何将 View Nib 加载到另一个窗口中?我是否必须创建
我想将多个env.variables转换为静态结构。 我可以手动进行: Env { is_development: env::var("IS_DEVELOPMENT")
正如我从一个测试用例中看到的:https://godbolt.org/z/K477q1 生成的程序集加载/存储原子松弛与普通变量相同:ldr 和 str 那么,宽松的原子变量和普通变量之间有什么区别吗
我有一个重定向到外部网站的按钮/链接,但是外部网站需要一些时间来加载。所以我想添加一个加载屏幕,以便外部页面在显示之前完全加载。我无法控制外部网站,并且外部网站具有同源策略,因此我无法在 iFrame
我正在尝试为我的应用程序开发一个Dockerfile,该文件在初始化后加载大量环境变量。不知何故,当我稍后执行以下命令时,这些变量是不可用的: docker exec -it container_na
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我刚刚遇到一个问题,我有一个带有一些不同选项的选择标签。 现在我想检查用户选择了哪些选项。 然后我想将一个新的 html 文件加载到该网站(取决于用户选中的选项)宽度 javascript,我该怎么做
我知道两种保存/加载应用程序设置的方法: 使用PersistentStore 使用文件系统(存储,因为 SDCard 是可选的) 我想知道您使用应用程序设置的做法是什么? 使用 PersistentS
我开始使用 Vulkan 时偶然发现了我的第一个问题。尝试创建调试报告回调时(验证层和调试扩展在我的英特尔 hd vulkan 驱动程序上可用,至少它是这么说的),它没有告诉我 vkCreateDeb
我是一名优秀的程序员,十分优秀!