2017-06-23 54 views
1

我有一個嵌套回調的代碼塊。我對代碼重構感興趣,以使其更具可讀性並避免代碼膨脹。有人可以提及如何將下面的代碼轉換爲承諾。我希望做一個比較,看看它的價值延伸跨越這樣的代碼回調實現如何避免帶有承諾的代碼中的拖尾回調

dataApi.getClientEntityByCtnId(Number(key), function (error, client1) { 
    if (error) return callback(error, null); 
    if (client1.id == 0) 
     return callback("unregistered client:"+ key, null); 
    dataApi.getClientEntityByCtnId(Number(key2), function (error, client2) { 
     if (error) 
      return callback(error, null); 
     if (client2.id == 0) 
      return callback("unregistered client:" + key2, null); 

     dataApi.setClientRelationshipEntity(client1.id, client2.id, function (error) { 
      if (error) return callback(error, null);       
      dataApi.setClientRelationshipEntity(client2.id, client1.id, function (error) { 
       nbCRpushed++; 
       if (nbCRpushed%1000==0) dataApi.logger.info("nb CR pushed into BC ="+nbCRpushed+"/" + dataApi.nbCR); 
       if (error) return callback(error, null); 

       if (nbCRpushed == dataApi.nbCR) 
       { 
        dataApi.pushCRToCache(callback); 
       } 
      }); 
     }); 
    }); 
}); 
+1

你看過了嗎[如何將現有的回調API轉換爲承諾?](https://stackoverflow.com/q/22519784/1048572)? – Bergi

回答

0

更看中的代碼將承諾的努力異步/等待

async function optimised(){ 
    var client1 = await dataApi.getClientEntityByCtnId(+key); 
    if (client1.id == 0) 
    throw new Error("unregistered client:"+ key); 
var client2 = await dataApi.getClientEntityByCtnId(+key2); 
if (client2.id == 0) 
    throw new Error("unregistered client:" + key2); 

await dataApi.setClientRelationshipEntity(client1.id, client2.id); 
await dataApi.setClientRelationshipEntity(client2.id, client1.id); 

//i think the code below is broken now... more info needed to make it work asyncly 
nbCRpushed++; 
if (nbCRpushed%1000==0) dataApi.logger.info("nb CR pushed into BC ="+nbCRpushed+"/" + dataApi.nbCR); 
if (nbCRpushed == dataApi.nbCR){ 
       dataApi.pushCRToCache(callback);//um callback? what should we do here?? 
} 
} 

可用像這樣的:

optimised().then(function(){ 
    console.log("sucess"); 
},function(error){ 
    console.error(error); 
}); 

注意,所有dataApi方法需要返回的承諾,使這項工作...