我想知道是否有任何方法可以“暂停”脚本执行,直到承诺被解决为止,而不仅仅是继续执行该特定脚本。(我知道我可以使用.then(),在es6中我甚至可以使用等待,但这不是我要的)。 我可以实现这样的睡眠功能:
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对象并拦截该调用并使它异步,但这会弄乱一切,有什么想法吗?
答案 0 :(得分:0)
您可以这样睡觉:
function sleep(duration) {
return new Promise(function(resolve, reject) {
setTimeout(()=> { resolve(0) }, duration);
})
}
并在需要时使用await sleep(1000); //miliseconds
呼叫睡眠;
答案 1 :(得分:0)
您需要这个吗?
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
sleep(2000)
alert('Hello!')
答案 2 :(得分:0)
我可以每秒检查一次承诺状态吗?
如果必须同步,则否,只要您的同步脚本正在运行,就不会执行其他代码。
还是因为js是单线程的,实际上会冻结所有内容?
如果全部同步,那么它将冻结所有内容,并且Promise将无法解析,因为正在检查Promise状态的同步脚本正在阻止。
有什么麻烦的方式来同步等待诺言吗?
否,没有同步方法可以等待Promise解决。
承诺不要在JavaScript上下文中创建多线程。承诺使协作式多任务处理变得更加容易,尤其是在引入await
/ async
的情况下,但是代码仍然是单线程的。
答案 3 :(得分:0)
您正在寻找类似的东西吗?抱歉,我还是不太了解您的问题。
var promise = new Promise((res, rej) => $.getJSON( "https://jsonplaceholder.typicode.com/todos/1", res, rej))
while(promise.status === 'Pending') { // this waits for the promise
continue;
}
promise.then(console.log)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 4 :(得分:-1)
通常,对于肮脏的黑客,您只需设置一个无限的时间间隔即可检查您需要的内容,当它变为true时,请清除该时间间隔并调用任何函数以继续执行预期的执行。