簡體   English   中英

暫停執行JavaScript標記

[英]Pause javascript tag execution

我想知道是否有任何方法可以“暫停”腳本執行,直到承諾被解決為止,而不僅僅是繼續執行該特定腳本。(我知道我可以使用.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對象並攔截該調用並使它異步,但這會弄亂一切,有什么想法嗎?

您可以像這樣睡覺:

function sleep(duration) {
  return new Promise(function(resolve, reject) {
    setTimeout(()=> { resolve(0) }, duration);
  })
}

並在需要時調用sleep並await sleep(1000); //miliseconds await sleep(1000); //miliseconds

你需要這個?

 function sleep(delay) { var start = new Date().getTime(); while (new Date().getTime() < start + delay); } sleep(2000) alert('Hello!') 

我可以每秒檢查一下承諾狀態嗎?

如果必須同步,則否,只要您的同步腳本正在運行,就不會執行其他代碼。

還是因為js是單線程的,這實際上將凍結所有內容?

如果全部同步,則是的,它將凍結所有內容,並且Promise不會解析,因為正在檢查Promise狀態的同步腳本正在阻止。

是否有任何麻煩的方式來同步等待諾言?

不,沒有同步方法可以等待Promise解決。

承諾不要在JavaScript上下文中創建多線程。 承諾使協作式多任務處理變得更容易,尤其是在引入await / async ,但是代碼仍然是單線程的。

您正在尋找這樣的東西嗎? 抱歉,我無法完全理解您的問題。

 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> 

通常,對於骯臟的黑客,您只需設置一個無限的時間間隔即可檢查所需的內容,當它變為true時,請清除該時間間隔並調用任何函數以繼續執行預期的執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM