2016-11-17 5 views
0

投稿がテーブルにあるかどうかを確認します。そうでなければ、私はそれを挿入します。だから私は2つの非同期呼び出しを行う必要があります。私は約束でこれを平らにすることはできますか?約束をまとめる

var insertOrUpdateBuilding = (callback)=>{ 
    // Check if building exists 
    db('buildings') 
     .where({externalId: buildingId}) 
     .then(function(rows){ 
     // Building exist, do nothing 
     if(rows){ 
      callback(); 
     } 
     // Building does not exist. Insert it 
     if(!rows){ 
      return db('buildings').insert({externalId: buildingId, name: req.body.name}) 
     } 
     }) 
     .then(function(promise){ 

     }) 
     .catch(function(err){ 
     callback({message: 'Error looking up building', err: err}) 
     }) 
    }; 

私は立ち往生しています。どのように進めますか?

+0

一般に、約束とコールバックは混在しません。使用しているデータベースライブラリとは何ですか? – Tomalak

+0

http://stackoverflow.com/questions/12273437/jquery-deferred-object-with-nested-ajax-calls –

+1

@SunilBN OPは明らかにjQuery遅延オブジェクトを使用していません。 – Tomalak

答えて

3

約束事は固執しています。使用を開始すると、関連するすべての機能は約束を受け入れ、返す必要があります。 db()が約束されている場合、あなたの例では、その後、insertOrUpdateBuildingも同様に約束したする必要がありすぎて、つまり、いくつかのthen sのdb(...)はそれ

var insertOrUpdateBuilding =() => db('buildings') 
    .where({externalId: buildingId}) 
    .then(rows => rows || 
     db('buildings').insert({externalId: buildingId, name: req.body.name})) 
    ; 

と誰insertOrUpdateBuildingを呼び出すに添付約束を返す必要があります:

insertOrUpdateBuilding().then(okay).catch(error!) 

ロギング/デバッグの目的以外では、低レベルの機能では一般にcatchのエラーは意味を持ちません。誤差を上のレベルに伝播させて、それを賢明に扱うことができます。ユーザーに知らせる。

0

ES7 async/awaitを使用してみてください。

var async insertOrUpdateBuilding = (callback) => { 
    try { 
     // Check if building exists 
     let rows = await db('buildings') 
      .where({externalId: buildingId}); 
     // Building exist, do nothing 
     if (rows){ 
      callback(); 
     } 
     // Building does not exist. Insert it 
     if (!rows) { 
      let row = await db('buildings').insert({ 
      externalId: buildingId, 
      name: req.body.name 
      }); 
      callback(); 
     } 
    } catch (e) { 
     callback({message: 'Error looking up building', err: e}); 
    } 
}; 
+1

これは確信しています。疑問は約束事で、非同期/待機は利用できないかもしれません。 –

+0

@DavinTryonコメントをいただきありがとうございます。私はちょうどそれを追加した。最初に、コードの原則を台無しにしないためにそれをスキップしました。 –