暂停javascript标记执行
我想知道是否有任何方法可以“暂停”脚本执行,直到承诺得到解决,而不是继续执行那个特定的脚本。(我知道我可以使用.then(),在es6中我甚至可以使用wait,但这不是我要问的)。 我可以实现这样的睡眠功能:暂停javascript标记执行,javascript,Javascript,我想知道是否有任何方法可以“暂停”脚本执行,直到承诺得到解决,而不是继续执行那个特定的脚本。(我知道我可以使用.then(),在es6中我甚至可以使用wait,但这不是我要问的)。 我可以实现这样的睡眠功能: function sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) &g
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
这个函数位于第三方js中,现在我可以钩住XMLHttpRequest对象并截获该调用并使其异步,但这会搞乱一切,有什么想法吗 你可以这样睡觉:
function sleep(duration) {
return new Promise(function(resolve, reject) {
setTimeout(()=> { resolve(0) }, duration);
})
}
并在需要时使用
wait sleep(1000)调用sleep//毫秒
通常,对于肮脏的黑客,您只需设置一个无限间隔来检查您需要的任何内容,当它变为真时,清除该间隔并调用任何函数来继续执行预期的执行。您需要这个吗
功能睡眠(延迟){
var start=new Date().getTime();
while(new Date().getTime()
我可以每秒钟检查一次承诺状态吗
如果必须同步,则不同步,只要同步脚本正在运行,就不会执行其他代码
或者因为js是单线程的,这实际上会冻结一切
如果是全部同步,那么是的,它将冻结所有内容,并且承诺将无法解析,因为检查承诺状态的同步脚本正在阻止
同步等待承诺有什么混乱的方式吗
不,没有同步方式来等待承诺解决
承诺不会在JavaScript上下文中创建多线程。承诺使协作多任务处理变得更容易,特别是引入了
await
/async
,但代码仍然是单线程的。您正在寻找这样的东西吗?很抱歉,我没有完全理解你的问题
var promise=newpromise((res,rej)=>$.getJSON(“https://jsonplaceholder.typicode.com/todos/1“,res,rej))
while(promise.status==='Pending'){//这将等待承诺
继续;
}
promise.then(console.log)
您的睡眠功能实际上会阻塞浏览器,并且永远不会结束。@因为它在几毫秒后结束。。。我的问题是这个循环运行的时间承诺状态可以改变吗?不,你的代码执行1e7
迭代的速度比new Date()快。getTime()-start
达到毫秒
@Justinas好的,谢谢你的洞察力,但是问题还是一样的,如果我将循环并检查承诺状态,并且“挂起”执行时,承诺状态可能会改变?或者我将永远循环?哎呀,看起来像是一个。我知道我可以做到这一点,但我实际上要求的是不同的,如果你调用这个函数,你将得到一个承诺作为回报,js将继续执行(我没有使用异步函数)这不是我需要的。你可以在这个睡眠功能中使用异步函数iLife。我认为没有其他方法可以不阻止浏览器?我想看看是否还有其他方法。我会编辑我的问题来添加更多细节。我想我不是很具体。很脏,很容易锁定浏览器。很好的答案,谢谢!我可以考虑几个问题为了实现这一点,我只需要知道我的方向是否正确,我的一个想法是在iframe中执行脚本,劫持xhr调用,使其异步,在主窗口中调用异步xhr,并冻结iframe窗口,直到我的承诺解决为止,我可以这样做吗?@avidahan试图进行这样的攻击,看起来你有一个我只需要知道我是否在正确的方向上,你肯定是在错误的方向上。你会发现任何允许同步多任务的解决方案都肯定会在浏览器更新时失败。所以你真的应该停下来寻找这样的解决方案,你应该修复代码的另一部分。正如我在编辑中提到的,这不是我的设计,代码来自第三方js,我只想在不损坏代码的情况下消除同步xhr
function sleep(duration) {
return new Promise(function(resolve, reject) {
setTimeout(()=> { resolve(0) }, duration);
})
}