Я пытаюсь понять обещания и то, как JavaScript работает с очередью, циклом событий и т. Д.
Я подумал, что если я помещу медленную синхронную функцию внутрь промиса, эта медленная синхронизирующая функция будет делегирована в фоновый режим, и я смогу использовать .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/
Однако пользовательский интерфейс не отвечает, пока работает этот код.
Поэтому мне было интересно, может ли кто-нибудь объяснить, что здесь происходит? Являются ли обещания только способом обработки кода, который уже «сделан» асинхронным?
(Если да, то как это делается?)
Как мне справиться с медленным кодом синхронизации, если я не хочу, чтобы он зависал в пользовательском интерфейсе? Должен ли я использовать веб-воркер для этого?
Благодарен за любые разъяснения. Спасибо.
syncSleep
? Что мне делать с медленным кодом синхронизации, если я не хочу, чтобы он зависал в пользовательском интерфейсе? Что на самом деле реализуетсяjavascript
? Чего вы пытаетесь достичь? - person guest271314   schedule 07.05.2016"This should appear right away! (but it doesn't)"
до завершенияwhile
, — это использоватьalert()
, то есть вызвать собственную глобальную функцию. В качестве альтернативы можно просто обновитьDOM
перед вызовом циклаwhile
вsyncSleep
- person guest271314   schedule 07.05.2016new Date().getTime()
, используйтеDate.now()
. Тот же результат, не тратится память на выделение объектов и не тратится время на ненужный сборщик мусора. - person Mike 'Pomax' Kamermans   schedule 07.05.2016