2017-06-05 40 views
0

下面是我的代碼的簡化,我basicly運行的函數,該函數內部創建了一個承諾並返回它。由於某些原因,使用console.time()進行測試,看起來代碼實際上是阻塞的。 x.root函數需要大約200ms才能運行,並且兩個console.time()測試都能提供大約200ms的時間。現在,如果我沒有在包裝的setTimeout的功能多歲的老把戲,問題消失了,但我想知道我在做什麼錯在這裏?爲什麼我的諾言似乎阻止執行

我真的很喜歡能夠創建,解決和拒絕我的輔助函數內的承諾,然後就打電話,然後再和catch我的功能,而無需在較早的級別創建的承諾。這裏有什麼故障?

parseroot = function(params) { 
    return new Promise(function(resolve, reject) { 
     try { 
      var parsed_html = x.root(params); 
      x.replacecontents(params.target, parsed_html); 
      resolve(true); 
     } 
     catch(e) { 
      reject(e); 
     } 
    }); 
} 


console.time("Test 1"); 
console.time("Test 2"); 
var el = document.querySelector("#custom-element"); 
el.parseroot({ 
    section:"list", 
    target: "#list-container", 
}).then(function(response) { 
    console.info("searchresult > list() success"); 
    console.timeEnd("Test 2"); 
}); 
console.timeEnd("Test 1"); 
+1

你的代碼是*封鎖*? var parse_html = x.root(params);包裝在超時纔是正道...... –

+0

承諾不使代碼並行或東西執行。如果將封鎖動作的結果封裝在承諾中,它仍然是阻止動作。 – Bergi

回答

4

承諾不會將同步代碼轉換爲異步代碼。

如果您傳遞給Promise塊的功能,則承諾將阻止過。

+0

謝謝,我錯了。我認爲Promise的內部是異步運行的,並且返回的對象正在等待解析/拒絕,而其他所有內容都並行運行。 – red

相關問題