Обещания не могут запустить код после разрешения / отклонения - PullRequest
1 голос
/ 15 марта 2019

У меня есть асинхронная функция в асинхронной функции. Во втором я должен дождаться, когда обещания разрешатся или отклонятся, а после запуска другого кода ниже. Но если обещание отклонить мой код остановки и не запускать другие функции. Как я могу это исправить?

await axios.all(promises).then(res => {
  axios.patch("/url", { foo: bar }).then(async () => {
    const promises2 = arr.map(item => {
      return axios.post("/url-2", item)
    });
    await Promise.all(promises2)
      .then(() => console.log("resolved")) //this not calling ever
      .catch(() => console.log("failed")) //this not calling ever

    console.log("This console log ever not working")
  })
})

Ответы [ 3 ]

0 голосов
/ 15 марта 2019

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

Попробуйте переписать код следующим образом:

let res = await axios.all(promises).catch(() => { console.log("failed"); return false; });

if (!res) {
    // Do something when rejected
    ....
}

// Call the 2nd promise
let res2 = await axios.path("/url", {foo: bar}).catch(() => {console.log("failed 2"); return false; });

if (!res2) {
    // Do something when the 2nd promise is rejected
    ...
}

// Call your last promise
let res3 = await Promise.all(promises2).catch(() => {console.log("failed 3"); return false; });

if (!res3) {
    // Do something if it is rejected again
    ....
}
// Otherwise, do your thing
0 голосов
/ 15 марта 2019

Попробуйте этот код, он должен точно указать, где произошла ошибка или отклонение (т.е. это определенно до того, как Promise.all(promises2) будет запущен

await axios.all(promises)
.then(res => axios.patch("/url", { foo: bar }), err => {
    throw `all(promises) failed with ${err}`;
})
.then(() => {
    const promises2 = arr.map(item => {
        return axios.post("/url-2", item);
    });
    return Promise.all(promises2)
    .then(() => console.log("resolved")) //this not calling ever
    .catch(err => {
        throw `all(promises2) failed with ${err}`;
    });
}, err => {
    throw `patch failed with ${err}`;
})
.catch(err => console.error(err));

Примечание. Я удалил async / await, потому что в размещенном вами коде он совершенно не нужен

0 голосов
/ 15 марта 2019

Обещания не связаны должным образом, axios.patch(...) обещание не возвращается. await является синтаксическим сахаром для then и catch, его цель - по возможности избавиться от вложенных функций. Должно быть:

const res = await axios.all(promises)
await axios.patch("/url", { foo: bar })

const promises2 = arr.map(item => {
  return axios.post("/url-2", item)
});

try {
  await Promise.all(promises2)
  console.log("resolved"))
} catch (err) {    
  console.log("failed");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...