Асинхронный инициатор в Javascript - PullRequest
0 голосов
/ 30 октября 2018

Часто используется, чтобы мы инициировали переменную синхронно.

const x = call_a_sync_function();

Но когда инициатор станет асинхронным, возникнет проблема.

const x = await call_an_async_function(); // SyntaxError: Unexpected reserved word

Я пробовал анонимный асинхронный инициатор, он не идеален.

let x;
(async () => x = await call_an_async_function())();
export function func() {
  call(x); // x would be undefined if func() is called too early.
}

Затем я попытался экспортировать функцию в анонимный асинхронный инициатор, снова не удалось.

(async () => {
  const x = await call_an_async_function();
  export function func() { // SyntaxError: Unexpected token export
    call(x);
  }
)();

Итак, есть ли лучшее решение?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Это особый случай этой проблемы . Асинхронный код нельзя превратить в синхронный. Если в экспорте используется обещание, то оно должно быть экспортировано:

const x = call_an_async_function();
export async function func() {
  call(await x);
}

После получения обещаний поток управления на основе обещаний распространяется везде, где необходимо поддерживать порядок выполнения и обработки ошибок вплоть до точки входа:

import { func } from '...';

(async () => {
  await func();
  ...
})().catch(console.error);
0 голосов
/ 30 октября 2018

Обернуть все в асинхронную функцию,

async function getX() => {let x = await call_an_async_function()); return x;}
function func() {
  call(x); // x would be undefined if func() is called too early.
}

async function main(){
   let x = await getX()
   func();
}

main()

Как только top-level-await станет частью ecmascript ( предложение ), вам не нужно будет заключать ожидание в асинхронную функцию и использовать await на верхнем уровне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...