Я пытаюсь склонить голову к обещаниям и тому, как работает JavaScript с его очередью и циклом событий и т. Д.Почему синхронная функция сна не выполнена async, будучи внутренне обещанием?
Я думал, что если я поставлю медленную синхронную функцию внутри обещания, эта медленная функция синхронизации будет делегирована на задний план, и я мог бы использовать .then
, чтобы справиться с ним, когда это было сделано.
function syncSleep(ms){
var end = new Date().getTime() + ms;
var start = new Date().getTime();
while (start < end) {
start = new Date().getTime();
}
}
function p() {
return new Promise(function(resolve) {
syncSleep(5000);
resolve("syncSleep done!");
});
}
p().then(function(s) {
var div = document.getElementById('async');
div.innerHTML = s;
});
var div = document.getElementById('sync');
div.innerHTML = "This should appear right away! (but it doesn't)";
https://jsfiddle.net/7mw6m2x5/
Пользовательский интерфейс не отвечает на запросы в то время как этот код работает, хотя.
Так что мне было интересно, может кто-нибудь объяснить, что здесь происходит? Обещают только способ обработки кода, который уже «сделан быть» async?
(Если да, то как это делается?)
Как я справляюсь с медленным кодом синхронизации, если я не хочу, чтобы заморозить UI? Должен ли я использовать веб-исполнителя для этого?
Благодарен за любые разъяснения. Благодарю.
_ ", и я мог бы использовать. То, чтобы справиться с ним, когда это было сделано" _ Нет значения, похоже, возвращается из 'syncSleep'? _ «Как мне работать с медленным кодом синхронизации, когда я не хочу, чтобы он замораживал пользовательский интерфейс?» _ В чем заключается фактический «javascript»? Чего вы пытаетесь достичь? – guest271314
@ guest271314, я просто пытаюсь понять, как работает этот JavaScript. У меня была гипотеза о том, как этот код будет работать, но оказалось, что я ошибался. Итак, теперь я пытаюсь исправить свое понимание :-) –
Да, для этого вам следует использовать WebWorkers или child_process/cluster. Невозможно обрабатывать медленный код синхронизации на одном потоковом языке. В качестве альтернативы, если вам разрешено изменять медленный код, вы можете переписать его с помощью генераторов/итераторов ES6 или как они были вызваны. – Dodekeract