2017-08-12 11 views
2

私は約束に新たな挑戦が残っています。プロミス処理 - dbエントリが存在する場合に更新する

目的:P_KEYが存在する場合のみ、DBエントリを更新します。

現在のdbはモジュールを通して公開され、モジュールはdbのgetおよびputメソッドを持っています。どちらも約束を返す。

アプローチ:

  1. ノードJSでupdateメソッドハンドラのAPIコールIDと値のセット(JSON)
  2. とハンドラ内でDBモジュールチェックのget方法にPOSTメソッド呼び出しの値の場合の約束に成功した場合は空です。そうでない場合はfalseを返します。
  3. trueの場合、データはdbモジュールのputメソッドへの呼び出しが存在します。

しかし、何らかの形でデータは常にfalseを返します。たとえdbエントリがdb apiによって作成されたとしても。

/** Function to check if p_key exist*/ 
function checkIfPKExists(idVal){ 
    pkdb.get(idVal).then(function(value){ 
    if(value){ 
     return true; 
    } else { 
     return false; 
    } 
    }, 
    function(err){ 
    console.log(err); 
    return false; 
    }) 
} 

/** UPDATE METHOD **/ 
var ch = checkIfPKExists("p_k"+req.body.id); 
if(!ch){ 
    res.send("pk does not exist oo " + req.body.id); 
} else { 
    var pk_promise = pkdb.put("p_k"+req.body.id, req.body.pk); 
    pk_promise.then(
    function(){ 
     res.send(JSON.stringify(req.body.pk) + "Updated Successfully"); 
    }, 
    function(err){ 
     res.send("Error occurred : " + err); 
    } 
) 
} 

私の理解では、ch値はcheckPK機能から、それはちょうど先に行くと、デフォルトでtrueを意味し、要素があるかどうか、同じ結果であるかどうかに関係なく行わifループを処理約束のthatsので、設定されています。見つかりません。

修正するにはどうすればよいですか?

答えて

0

1つの問題は何も値がcheckIfPKExists()関数呼び出しからreturn EDは、Why is value undefined at .then() chained to Promise?を見ないことです。関数から

function checkIfPKExists(idVal) { 
    // `return` the `Promise` here 
    return pkdb.get(idVal).then(function(value) { 
    if (value) { 
     return true; 
    } else { 
     return false; 
    } 
    }, function(err) { 
    console.log(err); 
    return false; 
    }) 
} 

/** UPDATE METHOD **/ 
var ch = checkIfPKExists("p_k" + req.body.id); 

ch.then(function(bool) { 
// if `true` do stuff 
if (bool) { 
    var pk_promise = pkdb.put("p_k" + req.body.id, req.body.pk) 

    return pk_promise.then(function() { 
    return res.send(JSON.stringify(req.body.pk) + "Updated Successfully"); 
    }, function(err) { 
    return res.send("Error occurred : " + err); 
    }) 
} else { 
    // do other stuff 
    return res.send("pk does not exist oo " + req.body.id); 
}) 
.catch(function(err) { 
    // handle error 
}) 
+0

あなたの答えをありがとう。それは本当に私がより良い約束を理解するのを助けました。ニースのコードフローも。 –

0

checkIfPKExists()あなたがCHを使用したい場合は、関数の中でそれを取得し、その値を使用するように.then()を使用する必要があります、非同期関数です。

function checkIfPKExists(idVal) 
{ 
    return pkdb.get(idVal).then(function(value) 
    { 
     if(value) 
     { 
      return true;} 
     else 
     { 
      return false; 
     }   
    }, function(err) 
    { console.log(err); 
      return false; 
    }) 
} 

/** UPDATE METHOD **/ 
checkIfPKExists("p_k"+req.body.id).then(function(ch){ 
    if(!ch) 
    { 
     res.send("pk does not exist oo " + req.body.id); 
    } 
    else 
    { 
     return pkdb.put("p_k"+req.body.id, req.body.pk).then(
      function() 
      { 

       res.send(JSON.stringify(req.body.pk) + "Updated Successfully"); 

      }, 
      function(err) 
      { 

       res.send("Error occurred : " + err); 
      }) 
}}) 
+0

注意返され、値がmarvel308 @回答 – guest271314

+0

のコードで 'checkIfPKExists()'関数呼び出しから返されませんそれは私の質問に答えるPromise値を取得するために.then().catch()を使用してください。私は答えをアップアップしましたが、私は担当者が<15だったので反映しません。私はあなたの時間と助けに感謝します。ありがとうございました! –

関連する問題