Обещание, которое включает в себя еще одно asyn c, ждут обещания - как решить? - PullRequest
2 голосов
/ 24 марта 2020

Мне нужно сделать два почтовых запроса подряд. Существует асин c функция «post form», которая запускает запрос с ключевым словом «await», а результат обрабатывается в блоке «then».

Я пытаюсь выполнить этот запрос, ожидая обещание, в котором я вызываю вышеупомянутую функцию asyn c. Проблема в том, что кажется, что обещание не может быть разрешено внутри блока функций "then".

У меня есть пример кода, чтобы показать проблему (посмотрите на функцию start(), где она начинается). См. fiddle

//Returns a promise. It contains another async-await promise
function mainFunction() {

  return new Promise( () => {           //<-- this never resolves

       async function postForm(){

          //(Post a form)
         await new Promise( (resolve, reject) => {
              setTimeout(() => {
                resolve('resolved');
              }, 2000);

          }).then( response => {    // <-- how to resolve the first promise inside here?

               console.log('promise 2 response: ',response) 

               //Try to resolve the 1st promise (doesn't work)
               new Promise( (resolve,reject) => resolve('promise 1 resolved') );

          }).catch( error => {
              console.log(error)
          }) 
      }
      postForm();

  })

}

//Make two posts in succession
async function start(){ 

  //Post 1 - (never resolves)
  await mainFunction().then( response => {

        //(Next: make post request 2)

  }).catch( error => {
      console.log(error)
  })
}

start();

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

1 Ответ

1 голос
/ 24 марта 2020

Если вы используете обещания, то вы работаете с .then() и .catch(), если вы работаете с async/ await, тогда вы не используете .then() и .catch(), потому что asyn c / await - это syntati c sugar, так что нам не нужно вкладывать наши ответы снова и снова.

Если вы хотите сделать 2 почтовых запроса, например, с axios или fetch, тогда вы можете просто использовать async / await, потому что они возвращают обещание.

async function requests(){
   //await makes the request wait till it gets some response
   const response1 = await axios.post("url", {data});
   const response2 = await axios.post("url2", {data});

}
...