Проблема решить обещание - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь выполнить обещание с помощью await, поэтому я могу продолжить работу без огромного вложенного кластера F.

var getPort = require('get-port');

var get_port = async function(){
  var port_promise = new Promise((resolve_port) => {
    getPort({port: 16100}).then(resolve_port);
  });

  var port = await port_promise;
  return port;
};

var port = get_port();

Однако этот код выдает ошибку на

server.listen(port);

, говоря, что значение является обещанием, а не числом.Я думал, что об этом позаботится ожидавший.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Асинхронные функции возвращают Объект Promise , который в конечном итоге будет разрешен возвращаемым значением, указанным при выполнении тела функции - либо путем выполнения оператора возврата, либо путем выполнения последнего оператора в теле и возврата undefined.

Асинхронные функции не ожидают завершения асинхронных операций внутри функции async.Это делается для того, чтобы код, вызывающий асинхронную функцию, мог завершиться и вернуться к циклу событий, что позволяет продолжить выполнение любых ожидающих или вновь инициированных асинхронных операций.

Оператор await вызывает then для своего обещания операнда,сохраняет контекст выполнения функции, возвращает диспетчер задач, вызывает метод get с помощью предоставленных ей обработчиков then, восстанавливает сохраненный контекст выполнения и возвращает выполненное значение ее операнда в результате операции await.Из-за использования then обратного вызова операции await никогда не оцениваются синхронно.

Итак,

var port = get_port();

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

var port = get_port();
port.then( port=> server.listen(port));


В опубликованном коде показан антипаттерн создания обещания, которое всегда разрешается илиотклонено другим обещанием - просто верните другое обещание - и если вы всегда возвращаете обещание из функции async без использования await, это не обязательно должно быть функцией async, во-первых.
0 голосов
/ 24 мая 2018

Await не превращает ваше обещание в синхронный код;это просто удобный способ упорядочить разные биты асинхронного кода.Асинхронные функции все еще должны ожидаться сами или иметь цепочку .then.get_port является асинхронным.

const getPort = require('get-port');

async function startServer() {
  // Somehow get a server
  var port = await getPort({ port: 16100 });
  server.listen(port);
}

// In calling code
async function someAsyncFunc {
  await startServer();
}
// or startServer().then(() => { ... }); if you are outside of an async func
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...