Async вместо then () для server.listen () - PullRequest
0 голосов
/ 14 ноября 2018

Вот как запускается сервер apollo:

server.listen(port).then(({ url }) => {
  console.log(`Server ready at ${url}`)
})

Я бы хотел использовать синтаксис async / await.Поэтому я попытался сделать - что не так:

server.listen(port, async ({ url }) => {
  await anyFunction()
  console.log(`Server ready at ${url}`)
})

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Вы должны await обещание возвращено , не возвращайтесь к стилю обратного вызова:

 (async function () {
    const url = await server.listen(port);
    console.log(`Server listening at "${url}"`);
 })();
0 голосов
/ 14 ноября 2018

async-await ведет себя аналогично цепочке .then(), await ожидает обещания, которое будет разрешено или отклонено, а затем продолжает процесс, как .then() продолжить при разрешении обещания и .catch() при отклонении обещания.

await возвращает тот же результат, который .then() получает при разрешении обещания, то есть:

foo().then( function(result){}); // got result here
result = await foo(); // will get same result here too as in above function.

аналогично catch(err) в try-catch получает ту же ошибку, что и .catch( function(err) {}) в .then()-.catch().

Узнайте больше об async-await здесь и здесь .

Чтобы преобразовать ваш .then () в async-await, просто сделайте это:

(async function () {
    try {
        const { url } = await server.listen(port);
        console.log(`Server ready at ${url}`);
    } catch(e) {
        // handle errors
    }
})();      // This is [IIFE][3]. In this case it's better to have IIFE then regular function, as functions needed to be called.

async-await как функция:

async function startServer() {
    try {
        const { url } = await server.listen(port);
        console.log(`Server ready at ${url}`);
    } catch(e) {
        // handle errors
    }
}

startServer();    // Not an IIFE
0 голосов
/ 14 ноября 2018

Вы должны сделать функцию, чтобы весь кодовый блок был , содержащийся в async.Затем, так же, как .then вызывается на server.listen, вы должны await server.listen(... вместо этого:

async function foo() {
  // ...
  const { url } = await server.listen(port);
  console.log(`Server ready at ${url}`);
}

Удостоверьтесь, что ошибки тоже отлавливаются - либо в получателе foo:

foo()
  .catch((err) => {
    // handle errors
  });

или в блоке catch внутри foo:

async function foo() {
  try {
    const { url } = await server.listen(port);
    console.log(`Server ready at ${url}`);
  } catch(e) {
    // handle errors
  }
}
...