2016-11-30 2 views
1

В настоящее время я пытаюсь реорганизовать кодовую базу, которую у меня есть, и хочу иметь более благоприятную для разработчиков кодовую базу. Часть 1 этого - изменение обратного вызова к обещаниям. В настоящее время в некоторых местах мы используем Async.waterfall, чтобы сгладить аддон обратного вызова, который работает для меня. Остальные места, где мы не могли потому, что они были условными обратные вызовы, Это означает, что различные функции обратного вызова внутри, если и ещеКак обрабатывать условные обратные вызовы с помощью Promises (Bluebird) в NodeJS

if(x){ 
    call_this_callback() 
}else{ 
    call_other_callback() 
} 

Теперь я использую Блюберд обещаний в Node.js и я не могу понять, как обрабатывать условный обратный вызов, чтобы сгладить аддон обратного вызова.

EDIT Более реалистичный сценарий, учитывая, что я не понял суть проблемы.

var promise = Collection1.find({ 
    condn: true 
}).exec() 
promise.then(function(val) { 
    if(val){ 
     return gotoStep2(); 
    }else{ 
     return createItem(); 
    } 
}) 
.then(function (res){ 
    //I don't know which response I am getting Is it the promise of gotoStep2 
    //or from the createItem because in both the different database is going 
    //to be called. How do I handle this 
}) 

ответ

2

Там нет никакой магии, вы можете легко приковать обещания с return внутри обещанием.

var promise = Collection1.find({ 
    condn: true 
}).exec(); 

//first approach 
promise.then(function(val) { 
    if(val){ 
     return gotoStep2() 
      .then(function(result) { 
      //handle result from gotoStep2() here 
      }); 
    }else{ 
     return createItem() 
      .then(function(result) { 
      //handle result from createItem() here 
      }); 
    } 
}); 

//second approach 
promise.then(function(val) { 
    return new Promise(function() { 
     if(val){ 
      return gotoStep2() 
     } else { 
      return createItem(); 
     } 
    }).then(function(result) { 
     if (val) { 
      //this is result from gotoStep2(); 
     } else { 
      //this is result from createItem(); 
     } 
    }); 
}); 

//third approach 
promise.then(function(val) { 
    if(val){ 
     return gotoStep2(); //assume return array 
    } else { 
     return createItem(); //assume return object 
    } 
}).then(function(result) { 
    //validate the result if it has own status or type 
    if (Array.isArray(result)) { 
     //returned from gotoStep2() 
    } else { 
     //returned from createItem() 
    } 
    //you can have other validation or status checking based on your results 
}); 

Редактировать: обновить образец кода, потому что автор обновил свой пример кода. Редактирование: добавлен третий подход, который поможет вам понять цепочку обещаний

+0

здесь вы используете три обратных вызова, которые будут называться? –

+0

Я только что редактировал вопрос. Сделал сценарий более объяснительным, не могли бы вы отредактировать свой ответ, чтобы это отразить. –

+0

Первый подход, который я нахожу, обескураживает, поскольку он способствует обратным вызовам в обратном вызове, чего я не хочу. Второй - более общий подход, требующий использования замыкания, где мне нужно убедиться, что у меня есть разные переменные во всей последовательной функции цепочки. Третий подходит, когда у вас есть другой тип данных из двух разных функций. Ни один из них, похоже, не является достаточно общим, но будет делать в этот момент времени. Будет продолжать охотиться за более элегантными решениями. Если обнаружено, это обновит его. Спасибо за ваше время. Очень признателен. –

0

Вот answer ветке обещаний: вложенной и неспокойной. Сделайте ветки и не присоединяйтесь к ним.

+0

Это длинный ответ и вопрос. @jiajianrong Я посмотрю на реализацию и вернусь к вам завтра. –

Смежные вопросы