用同步代码模拟异步承诺的蓝鸟模式

bluebird pattern for mocking asynchronous promises with syncronous code

我刚刚开始使用 bluebird(更普遍的是 node)。

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

所有关于反模式的话题都让我焦虑:-)

那么,将此同步代码转换为 promise 是否是一种合理的方法?

我这里有两个简单的函数。第二个调用第一个(不是 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);                        
  });                                                       
};                                                          

这些证明了一些事情:

很多事情我都可能弄错了。

我的表现如何?这里有反模式吗?还是其他菜鸟错误?

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

  • 每当您发现自己在使用 Promise 构造函数时,请首先尝试找到更简单的方法。是否已经有一个函数可以 return 承诺完成所需的任务? setTimeout 是真正的基于回调的 API,所以这里没有 错误 ,但鉴于您使用的是 Bluebird,您可以通过使用 Promise.delay 辅助函数:

    function getTestPatients = function(params) {                    
        return Promise.delay(test_patients, 200);      
    }
    
  • then 处理程序中调用 Promise.resolve 是不必要的。正如您可以 throw 异常一样,您可以 return 普通值,它们将被自动换行。所以看起来更干净只是

    return patient;