шаблон bluebird для имитации асинхронных промисов с синхронным кодом

Я только начинаю работать с bluebird (и с Node в целом).

Я хочу создать несколько макетов (для того, что в конечном итоге будет либо 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);                        
  });                                                       
};                                                          

Несколько вещей, которые они демонстрируют:

  • создание фальшивой задержки
  • создание обещания из синхронного кода
  • манипулирование результатом обещания в функции, которая делает обещание
  • выбрасывание ошибок

Так что довольно много вещей, которые я мог сделать неправильно.

Как я справился? Есть ли здесь антипаттерны? или другие ошибки новичка?


person ErichBSchulz    schedule 05.11.2015    source источник
comment
Измените return Promise.resolve(patient); только на return patient;. Не нужно создавать новое разрешенное обещание и просто возвращать его. Вы можете просто вернуть само значение.   -  person jfriend00    schedule 05.11.2015
comment
К вашему сведению, если вы знаете, что это рабочий код, и вам нужны предложения по улучшению, вы можете отправить его на codereview.stackexchange.com.   -  person jfriend00    schedule 05.11.2015
comment
Использование getTestPatient и getTestPatients в качестве имен функций позволяет легко запутаться при чтении кода.   -  person jfriend00    schedule 05.11.2015
comment
милое спасибо @jfriend00 изменение return Promise.resolve(patient); на просто return patient; действительно сработало! и чувствую себя лучше :-) - Я могу это сделать, потому что я уже в then(), верно? (кстати, вы должны опубликовать как ответ, не так ли?)   -  person ErichBSchulz    schedule 05.11.2015
comment
Да, возвращаемое значение обработчика .then() становится разрешенным значением промиса. Точно так же выброшенное значение исключения становится отклоненным значением обещания. Это инфраструктура промисов .then(), которая вызывает ваш обработчик .then() и, таким образом, получает возвращаемое значение или перехватывает исключение, из-за которого это происходит.   -  person jfriend00    schedule 05.11.2015


Ответы (1)


Здесь нет антипаттернов и ошибок. Тем не менее, две вещи, которые вы могли бы улучшить:

  • Всякий раз, когда вы обнаружите, что используете конструктор Promise, сначала попытайтесь найти более простой способ. Есть ли уже функция, которая возвращает обещание для желаемой задачи? setTimeout — это подлинный API на основе обратного вызова, поэтому здесь нет ошибок, но, учитывая, что вы используете Bluebird, вы можете удалить этот шаблон, просто используя Promise.delay вспомогательная функция:

    function getTestPatients = function(params) {                    
        return Promise.delay(test_patients, 200);      
    }
    
  • Вызов Promise.resolve в обработчике then не нужен. Точно так же, как вы можете throw исключить исключения, вы можете return использовать простые значения, и они будут автоматически упакованы. Так чище выглядит просто

    return patient;
    
person Bergi    schedule 05.11.2015