Как я могу получить массив результатов в Promise all error

1

Есть ли способ получить объект результата на Promise.all.catch?

Я хотел бы сделать две вставки в базе данных, одну в базе данных MySQL и одну в базе данных MongoDB. Если один из них терпит неудачу, я хотел бы удалить другой.

Вот несколько псевдокодов

const mysqlPromise = mysql.query('insert to table')
const mongoPromise = mongodb.insert('insert to collaction')
Promise.all([mysqlPromise,mongoPromise])
.then(result =>{

})
//i know it doesnt work that way but this is what i need to achive
.catch((err,result) =>{

    if(err[0] && err[1]){
      //do nothing
      return 
    }
    if(err[0]){
      mongodb.delete({_id:result[1].insertId})
    }
    else{
      mysql.query('delete from table where id = 'result[0].lastInsertId)
    }
    
})
  • 0
    и что, если удалить также не удается? :)
  • 0
    я могу сделать цикл, чтобы повторить каждые х секунд, это не идеально, но я могу жить с этим, вероятность того, что этот случай произойдет, очень мала. то, что я пытаюсь достичь, это транзакция на 2 разных БД, это самая близкая вещь, о которой я могу думать
Показать ещё 1 комментарий
Теги:
promise

1 ответ

2
Лучший ответ

Я не думаю, что то, что вы хотите, действительно доступно, как есть, однако вы можете манипулировать своими единственными обещаниями, прежде чем поймать их после all оператора:

Promise.all([
  mysqlPromise.catch(err => new Error('mysql failed')),
  mongoPromise.catch(err => new Error('mongo failed')),
])
.then(result => {
  const mysqlFailed = result[0] instanceof Error;
  const mongoFailed = result[1] instanceof Error;

  if (mysqlFailed && mongoFailed) {
    // nothing
  } else if (mysqlFailed){
    mongodb.delete({_id:result[1].insertId})
  } else if (mongoFailed) {
    mysql.query('delete from table where id = 'result[0].lastInsertId)
  } else {
    // success
  }
})
  • 0
    привет это даст мне отличное руководство, как это сделать, спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню