【问题标题】:bluebird pattern for mocking asynchronous promises with syncronous code使用同步代码模拟异步承诺的蓝鸟模式
【发布时间】:2016-02-05 18:42:28
【问题描述】:

我刚刚开始使用 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);                        
  });                                                       
};                                                          

这些展示了一些事情:

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

所以我可能做错了很多事情。

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

【问题讨论】:

  • return Promise.resolve(patient); 更改为 return patient;。无需创建新的已解决承诺并返回它。您可以只返回值本身。
  • 仅供参考,如果您知道这是有效的代码并且想要改进建议,那么您可以将其发送至codereview.stackexchange.com
  • 同时使用getTestPatientgetTestPatients作为函数名,阅读代码时容易混淆。
  • 非常感谢@jfriend00 将return Promise.resolve(patient); 更改为return patient; 确实有效!并且感觉更好:-) - 我可以这样做,因为我已经在then() 中,对吗? (顺便说一句,您应该作为答案发布,不是吗?)
  • 是的,.then() 处理程序的返回值变成了 promise 的解析值。类似地,抛出的异常值成为 promise 的拒绝值。正是 .then() promise 基础结构调用了您的 .then() 处理程序,从而接收返回值或捕获导致这种情况发生的异常。

标签: node.js promise bluebird


【解决方案1】:

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

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

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

    return patient;
    

【讨论】:

    猜你喜欢
    • 2015-05-02
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多