2017-04-20 14 views
2

私は同期(LocalStorage)から非同期(IndexedDB)にいくつかのデータベースコードを書き換えています。私はAlasqlライブラリとPromisesを使用しています。私が遭遇する問題の1つは、物事を非同期的に行うときに、コードの重複を避けることが不可能になることが時々あるということです。どのように非同期javascriptで冗長なコードを避けるには?

例えば、私の同期(擬似)のコードは次のようなものかもしれない(idExists、はdoupdateとdoInsertは、データベースのメソッドです):

function insertOrUpdate(data,id) 
{ 
    var result = null; 
    if (!idExists(id)) // idExists returns a boolean 
     result = doInsert(data,id); // doInsert returns an object 
    else 
     result = doUpdate(data,id); // doUpdate returns an object 
    doSomething(result); 
} 

非同期コードでは、それはこのようなものになり:

function insertOrUpdate(data,id) 
{ 
    var promise1 = idExists(id); // idExists returns a promise 
    promise1.then(function(id_exists) { 
     if (id_exists) { 
      var promise2 = doInsert(data,id); // doInsert returns a promise 
      promise2.then(function(result) { 
       doSomething(result); 
      }); 
     } 
     else { 
      var promise3 = doUpdate(data,id); // doUpdate returns a promise 
      promise3.then(function(result) { 
       doSomething(result); 
      }); 
     } 
    }); 
} 

コード内の2桁でdoSomethingに電話する必要があります。このような状況を避ける方法はありますか?これまでに尋ねられたことがあれば、私は約束と謝罪には新しいですが、私はこれに対する答えを見つけることができませんでした。

答えて

2

することはできreturnその後、約束チェーンに挿入されますチェーンコールバック、から約束。あなたのコードができ、そして、のように記述する必要があります。

function insertOrUpdate(data, id) { 
    return idExists(id) 
     .then(function (exists) { 
      return exists ? doInsert(data, id) : doUpdate(data, id); 
     }) 
     .then(doSomething); 
} 

doInsertまたはdoUpdateからの約束はidExistsから既存のチェーンにチェーンされますので、最終的.then(doSomething)は、その結果で実行されます。

+0

美しい(と私はそれを参照してください今明らか...)。ありがとうございます! –

1

あなたは変数に約束保管し、一度だけdoSomethingのを呼び出すことができます。

function insertOrUpdate(data, id) { 
    return idExists(id).then(function(id_exists) { 
    var promise = id_exists ? doInsert(data, id) : doUpdate(data, id) 
    return promise.then(doSomething) 
    }); 
} 
+0

良い答えですが、私は欺瞞があなたにそれを打つと思います。 :) とにかくありがとう! –

+0

はい、彼の答えは良いです:) – dfsq

関連する問題