【发布时间】:2019-02-01 17:56:10
【问题描述】:
我想知道是否有任何方法可以“暂停”脚本执行,直到一个承诺得到解决,然后才继续执行该特定脚本。(我知道我可以使用 .then() 并且在 es6 中我什至可以使用await ,但这不是我要问的)。 我可以像这样实现睡眠功能:
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
我可以每秒检查一次承诺状态吗?或者因为 js 是单线程的,这实际上会冻结所有内容?同步等待承诺的任何混乱方式?
编辑: 我的目标是处理这种情况:
function loadScript(src) {
try {
var parent = document.getElementsByTagName('head')[0] || document.documentElement;
var httpRequest = new XMLHttpRequest();
httpRequest.open('GET', src, false);
httpRequest.send();
var script = document.createElement('script');
script.type = 'text/javascript';
script.text = httpRequest.responseText;
parent.appendChild(script);
} catch (e) {}
}
这个函数位于第三方 js 中,现在我可以挂钩 XMLHttpRequest 对象并拦截该调用并使其异步,但这会搞砸一切,有什么想法吗?
【问题讨论】:
-
你的 sleep 功能实际上会阻塞浏览器并且永远不会结束。
-
@Justinas 它确实会在几毫秒后结束......我的问题是在这个循环运行的时间里,promise 状态可以改变吗?
-
不,您的代码将比
new Date().getTime() - start更快地执行1e7迭代达到miliseconds -
@Justinas 好的,感谢您的洞察力,但问题仍然是一样的,如果我将循环并检查承诺状态并实际“挂起”执行,承诺状态可以改变吗?还是我会永远循环?
-
糟糕,好像是XY Problem。
标签: javascript