Понимание обещания и ожидания - PullRequest
0 голосов
/ 22 мая 2018

Я просто пытаюсь понять, как Обещания и Ожидают .
Я хочу решить эту проблему, зарегистрировав 1, 2, 3 в таком порядке. В настоящее время он регистрирует 1, 3, 2.

Я знаю, что Обещание на самом деле не имеет смысла, но в моей программе есть другие применения, поэтому необходимо остаться.Маршрут от функции Caller до Test также должен остаться (при необходимости вы можете изменить их, но просто знайте, что они есть по какой-то причине)

У меня вопрос, как мне ждать Caller функция для разрешения?

Вот мой код:

function Test() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('2');
      resolve();
    }, 2000);
  })
}

function Caller() {
  Test();
}

console.log('1');
Caller();
console.log('3');

Я попробовал то, что я понимаю: заставить функцию Caller () ожидать тестовое обещание, но это, конечно, делает функцию Caller () асинхронной, и поэтому мыпо-прежнему получают 1, 3, 2

async function Caller() {
    await Test();
}

Может быть, есть какой-нибудь способ использовать await без выполнения асинхронной функции?

Ответы [ 4 ]

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

Это очень простой и простой способ сделать то, что вы просите.

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

function test(ms) {
  return new Promise((resolve, reject) => setTimeout(resolve, ms))
}

async function caller() {
  console.log(1, ' - caller() started');
   
  await test(2000).then(() => {
      console.log(2, ' - test() resolved')
  });
  
  console.log(3, ' - delayed until "test()" has resolved');
  
  return 4;
}

// wait for "caller()" to resolve
caller().then((result) => {
    console.log(result, " - caller() finished")
});

console.log(5);

Вот хорошая статья Google, которая расширяет эту тему:
Асинхронные функции - создание дружественных обещаний .

Цитировать источник .

0 голосов
/ 22 мая 2018
  • Вы можете только await функцию, которая возвращает обещание (ну, не совсем верно, если оно не возвращает обещание, оно создает обещание, которое разрешается мгновенно)
  • Вы можете толькоawait когда вы находитесь внутри асинхронной функции

function test() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('2');
      resolve();
    }, 2000);
  })
}

async function caller() {
  console.log('1');
  await test();
  console.log('3 (this is blocked awaiting the promise');
}

caller()
console.log("This is not blocked because caller is async");
0 голосов
/ 22 мая 2018

Все предыдущие ответы верны, но я просто чувствую, что этот ответ имеет больше смысла.Это более точно к исходному коду вопроса:

function Test() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('2');
      resolve();
    }, 2000);
  })
}

function Caller() {
  return Test();
}

(async() => {
  console.log('1');
  await Caller();
  console.log('3');
})();
0 голосов
/ 22 мая 2018

вот как вы можете использовать такие функции:

function sleep(ms) {
  return new Promise(r => {
    setTimeout(() => r(), ms);
  });
}

(async () => {
  console.log(1);
  await sleep(1000); // 1s
  console.log(2);
  await sleep(2000) // 2s
  console.log(3)
})();
...