Рубрики
Без рубрики

ждать обещания

Да, это сестра пост инверсии инверсии контроля. В этом посте я проиллюстрировал … Tagged с помощью JavaScript, WebDev, программирования.

Да, это сестра пост инверсии инверсии контроля. В этом посте я проиллюстрировал идею Coroutine (которая инвертирует перевернутый контроль), реализованный Async/watiate. Тем не менее, здесь я хотел бы подробно исследовать это и прийти к выводу, что синтаксис Async/await не является строго -коричневым.

Давайте посмотрим пример.

Код:

const nextFrame = () => 
new Promise(resolve => requestAnimationFrame(resolve));

(async function animate() {
  while (true) {
    // ... maybe we should add an exit/break condition
    // lovely in-control-render-loop
    await nextFrame();
  }
})();

Но у него есть проблема: Ваш код не выполняется в RAF -обратном вызове синхронно, но Micro-Task обратный вызов Анкет Таким образом, интуитивно вы получаете нулевую пользу от использования RAF.

По иронии судьбы, вы никогда не заметите это, поскольку некоторые реализации охватывают дело. Смотрите Время микрозама

Это связано с спецификацией обещания: всегда запускайте микро-задачу. Но в настоящей коратике, Ожидается, что контроль будет возобновлен в определенной точке синхронно. RAF является таким примером, и некоторые библиотеки/фреймворки будут использовать глобальную переменную по боковым эффектам Black Magic для хранения контекстной информации в синхронной процедуре. (И, к счастью, JavaScript однопоточный, в противном случае …). В любом случае Нам нужно сразу контролировать, а не делегировать микро-задачей Анкет

Кто -то может спросить: почему обещание должно быть асинхронным? Разве у нас нет синхронного обещания? (Off-Topic: функция исполнителя в конструкторе обещания выполняется синхронно.) Ответ: это может быть, но это не должно быть. Наличие асинхронной модели упрощает дизайн, поскольку обещание представляет возможный результат асинхронной работы. Для обещания мы только касаемся значение (и/или Причина отсутствия значения ). Так что обещание просто говорит вам: «Я в конечном итоге дам вам ценность, но не уверен, когда оно будет доступно (и не обязательно будет в микро-задаче.)». Даже выполненное/отклоненное обещание уведомляет о ценности асинхронно, чтобы сделать дизайн последовательный . Итак, вы знаете обратный вызов в .then всегда отложено. В противном случае,

// not runnable code, for illustration purpose
aMaybeSyncPromise.then((x)=>{
  // assume an error is thrown in callback
  throw 'Oops!!';
  // or access a closure variable
  doSomething(y); // 'y' is undefined if sync
});
// ... original flow of control
let y;
// ...

Синхронизация и асинхронный обратный вызов дают другое поведение.

Итак, давайте вернемся в Coroutine. Можем ли мы иметь правильную кораку в JavaScript? Конечно, генератором. Вы можете реализовать свой собственный планировщик и решить, когда вернуть контроль обратно. (Но это не кажется легким, как описано 😅. Я планировал перечислить здесь некоторые реализации, но ни один из них не является обещанием). Я продолжу по этой теме.

Оригинал: “https://dev.to/3shain/promise-coroutine-548i”