Асинхронный / ожидающий синтаксис: есть ли способ определить блок кода для выполнения после функции без блокировки выполнения? - PullRequest
1 голос
/ 28 апреля 2020

Недавно я задавал себе вопрос о том, как воспроизвести поведение then / catch с синтаксисом async / await.

С помощью then / catch я могу определить обратный вызов, который выполняется только когда Promise разрешает и затем продолжает выполнение следующим образом.

function test() {
    getUsersFromDB().then(users => console.log(users));
    console.log('The rest of the code here continues to execute');
    [...]
    // Promise resolves and logs the users value
}

Для меня с async / await вы можете иметь 2 возможных поведения.

1. Дождитесь выполнения функции и заблокируйте остаток выполнения

async function test() {
   const users = await getUsersFromDB();
    // Code in here is not executed until promises returns
    console.log(users);
}

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

function test() {
    const users = getUsersFromDB();
    // May log undefined
    console.log(users);
}

Могу ли я воспроизвести первый вариант использования, используя async / await?

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Использование then является самым простым решением, но вы можете использовать AIIFE :

function test() {
    (async () => {
         const users = await getUsersFromDB();
         console.log(users);
    })().catch(console.error);
    console.log('The rest of the code here continues to execute');
    [...]
    // Promise resolves and logs the users value
}

Альтернативой может быть только async do выражений .

0 голосов
/ 28 апреля 2020

Итак, вам нужно разделить код. Один фрагмент должен быть выполнен в синтаксисе async / await, а другой - как обычно.

Во-первых, что я хочу сказать, если вы сделаете следующее

async function test() {
   console.log('The rest of the code here continues to execute');   
   const users = await getUsersFromDB();
   // Code in here is not executed until promises returns
   console.log(users);
}

, которое поможет. Это может показаться немного странным, потому что мы только немного переместили строку, это не то, что мы хотели сделать, но ...

Ключевое слово await останавливает выполнение функции async, но у нас есть некоторый код, который должен продолжать работать в то время, когда await замораживает функцию, это означает, что мы не можем поместить код после await, только до.

Насколько я понимаю, код Тахат обозначается как «Остальной код здесь продолжает выполняться» также может быть асинхронным, поэтому полученный пример будет следующим:

async function test() {
   console.log('Some synchronous code');   

   setImmediate(() => { 
       console.log('Some asynchronous code'); 
   });

   const users = await getUsersFromDB();
   // Code in here is not executed until promises returns
   console.log(users);
}
...