bluebird模式用于使用同步代码模拟异步promise

时间:2015-11-05 03:02:05

标签: node.js promise bluebird

我刚刚开始使用蓝鸟(更常见的是节点)。

我想创建一些模拟(最终将是http或数据库调用)。

所有关于反模式的讨论让我感到焦虑: - )

这是将这种同步代码转换为承诺的合理方法吗?

我这里有两个简单的功能。第二个调用第一个(不是prod服务的方式),但它可以作为嵌套承诺的例证。

// mock function to return a promise of a collection        
var getTestPatients = function(params) {                    
  return new Promise(function(resolve, reject) {            
    setTimeout(function() {resolve(test_patients);}, 200);  
  })                                                        
}; 

// mock function to return a promise of an object           
var getTestPatient = function(params) {                     
  return getTestPatients().then(function(patients) {
    // wouldnt get entire patient list in prod - but this works for a mock
    var patient = _.find(patients, {urn: params.urn});      
    if (patient) {                                          
      patient.reviews = testReviews(params.uid);            
    }                                                       
    else {                                                  
      throw new Error('patient not found');                 
    }                                                       
    return Promise.resolve(patient);                        
  });                                                       
};                                                          

这些证明了以下几点:

  • 制造假延迟
  • 从同步代码创建承诺
  • 在作出承诺的函数中操纵承诺结果
  • 抛出错误

所以我可能犯了很多错误。

我是怎么做的?这里有任何反模式吗?或其他菜鸟错误?

1 个答案:

答案 0 :(得分:1)

没有反模式,也没有错误看到这里。但是,您可以改进两件事:

  • 每当您发现自己使用Promise构造函数时,首先尝试找到一种更简单的方法。是否已有一个函数确实返回了对所需任务的承诺? setTimeout是一个真正的基于回调的API,所以这里没有错误,但鉴于您正在使用Bluebird,您可以通过使用Promise.delay帮助程序删除该boilderplate功能:

    function getTestPatients = function(params) {                    
        return Promise.delay(test_patients, 200);      
    }
    
  • 不需要在Promise.resolve处理程序中调用then。正如您可以throw例外一样,您可以return普通值,它们将自动换行。看起来更清洁只是

    return patient;