2017-08-12 53 views
2

我对承诺的新挑战卡住了。承诺处理 - 更新数据库条目(如果存在)

目标:仅在存在P_KEY时更新数据库条目。

当前数据库是通过模块公开的,模块已经获取和放置db的方法。双方都回诺言。

方法:

  1. API调用的更新方法处理节点JS用ID和组值(JSON)
  2. 在处理程序后方法调用数据库模块检查get方法,如果在承诺值如果是,则成功为空或返回false否则为真。
  3. 如果为true;数据存在调用put db模块的方法。

但以某种方式数据它总是返回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功能,因为这就是设置一个承诺,它只是向前走并处理if环在默认情况下代表true,也不论做元素是否存在还是不一样的结果。未找到。

我能做些什么来纠正它?

回答

0

一个问题是没有价值为checkIfPKExists()函数调用return版,见Why is value undefined at .then() chained to Promise?。使用.then().catch()摆脱功能

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你将不得不使用一个。那么()得到它在一个函数,然后使用该值。

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

注意返回Promise价值,没有价值从'checkIfPKExists()返回'在代码的函数调用在回答 – guest271314

+0

@ marvel308它回答我的问题。我赞成答案,但没有反映,因为我代表<15代表。我感谢你的时间和帮助。谢谢! –