2017-10-27 11 views
1

Promise.all.catch上の結果オブジェクトを取得する方法はあり約束で結果配列を得ることができますか?は、どのように私はすべてのエラー

私は、データベース内の2つの挿入、MySQLデータベースに1つ、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

また、削除にも失敗したらどうしますか? :) – smnbbrv

+0

私はx秒ごとに再試行するループを行うことができますが、それは完璧ではありませんが、私はこのケースが起こるチャンスが低くなるということで生きることができます。私が達成しようとしているのは2つの異なるdbsでの取引です。これは私が考えることができる最も近いものです –

+0

[すべてのES6の約束が完了するまで待って、拒否された約束を待つ](https://stackoverflow.com/q/31424561)/1048572)これはあなたが個々の結果を観察することを可能にする – Bergi

答えて

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

こんにちは、これは私に大きな方向性を与える方法感謝する –

関連する問題