【问题标题】:How to avoid trailing callbacks in code with promises如何使用 Promise 避免代码中的尾随回调
【发布时间】:2017-06-23 14:50:35
【问题描述】:

我有一个包含很多嵌套回调的代码块。我对代码重构感兴趣,以使其更具可读性并避免代码膨胀。有人可以提一下如何将以下代码转换为承诺。我想做一个比较,看看是否值得在实现此类代码回调的代码中应用承诺

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);
                }
            });
        });
    });
});

【问题讨论】:

标签: javascript callback promise


【解决方案1】:

使用 async/await 更精彩:

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 方法都需要返回 Promise 才能使这项工作...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-24
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2010-09-21
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多