2018 Обновление
Последние версии Safari, Firefox и Node.js теперь также поддерживают async / await / promises.
2017 Обновление
JavaScript развился с тех пор, как был задан этот вопрос, и теперь имеет функции генератора, и в настоящее время запускается новый async / await / Promise. Ниже представлены два решения: одно с функцией генератора, которая будет работать во всех современных браузерах, а другое с использованием нового асинхронного / ожидающего вызова, который пока не поддерживается повсеместно.
Использование функции генератора:
'use strict';
let myAsync = (g) => (...args) => {
let f, res = () => f.next(),
sleep = (ms) => setTimeout(res, ms);
f = g.apply({sleep}, args); f.next();
};
let myAsyncFunc = myAsync(function*() {
let {sleep} = this;
console.log("Sleeping");
yield sleep(3000);
console.log("Done");
});
myAsyncFunc();
Использование async / await / Promises:
(Начиная с 1/2017, поддерживается в Chrome, но не в Safari, Internet Explorer, Firefox, Node.js)
'use strict';
function sleep(ms) {
return new Promise(res => setTimeout(res, ms));
}
let myAsyncFunc = async function() {
console.log('Sleeping');
await sleep(3000);
console.log('Done');
}
myAsyncFunc();
Обратите внимание на то, что оба эти решения имеют асинхронный характер. Это означает, что myAsyncFunc (в обоих случаях) вернется во время сна.
Важно отметить, что этот вопрос отличается от Что такое JavaScript-версия sleep ()? , когда запрашивающая сторона запрашивает реальный сон (никакого другого выполнения кода на процесс), а не задержка между действиями.