2015-06-23 2 views
0

Я использую Javascript Promises в первый раз и столкнулся с чем-то, чего не понимаю.В ожидании обещаний - код висит

То, что я пытаюсь сделать, это создать фазу проверки, которая проходит и проверяет вещи - в конечном счете, ожидая решения всех обещаний.

Для этого я создаю проверки обещание:

validate = function(data) { 
    var p = new Promise(function(resolve, reject)){ 

Здесь я определяю массив обещаний для всех различных вещей, я буду делать:

  var all_promises = Array(); 

Теперь делать вещи, как этот Sequelize во время добавления обещаний в этот массив (Sequelize возвращает обещания):

  all_promises.push(resBooking); 
     resBooking.count(...).then(...).catch(...); 

I имеют протоколирующие заявления, которые демонстрируют, что мы прошли через это, и все денди. Теперь мне нужно только подождать!

 Promise.all(all_promises).then(function(){ 
      p.resolve(); 
     }); 

Но эта глупая вещь висит - она ​​ждет чего-то для завершения. Нет использования ЦП. Что я делаю не так?

+0

Что вы хотите сказать, повесить? Выполняется ли выполнение или выполняется ли он на 100% процессоре? – Halcyon

+0

Что такое 'resBooking'? Не обещание, не так ли? – Bergi

+1

Не используйте [antiprottern] конструктора [http://stackoverflow.com/q/23803743/1048572)! – Bergi

ответ

5

Что вы хотите

validate = function(data) { 
    var p = new Promise(function(resolve, reject)){ 
     var all_promises = Array(); 
     all_promises.push(resBooking); 
     resBooking.count(...).then(...).catch(...); 

     Promise.all(all_promises).then(resolve); 
    }); 
    return p; 
}; 

Другими словами, вызов resolve, не p.resolve(). p.resolve будет генерировать ошибку времени выполнения (p не существует), который будет «проглочен» конструктором обещаний и приведет к сбою. Однако вы даже не сможете увидеть это отвергнутое обещание извне, так как вы также не возвращаете его из функции.

Однако, хотя этот код должен работать сейчас, вы по-прежнему совершаете «конструктор-конструктор обещаний». Вам не нужно создавать новое обещание, если у вас уже есть один в форме Promise.all. Поэтому вы можете просто написать

validate = function(data) { 
    var all_promises = Array(); 
    all_promises.push(resBooking); 
    resBooking.count(...).then(...).catch(...); 
    return Promise.all(all_promises); 
}; 

Я не уверен, что вышеуказанное это именно то, что вы хотите. Я не знаю, что такое resBooking, или resBooking.count. В любом случае вы будете ждать пообещали resBooking, а не результат then и catch, которые вы висели на нем. В зависимости от того, что вы пытаетесь выполнить, вам может понадобиться

validate = function(data) { 
    var all_promises = Array(); 
    all_promises.push(resBooking.count(...).then(...).catch(...)); 
    return Promise.all(all_promises); 
}; 
+0

Вау ... в тот момент, когда я увидел это, я не мог поверить, что пропустил это. Это определенно работает. Спасибо за лучший конструктор. Это объяснение имело больше смысла, чем другая статья. Могу ли я сделать 3 upvotes? ;-) – KateYoak

+0

@KateYoak на самом деле, вы можете [наградить щедростью] (http: //meta.stackexchange.com/questions/16065/how-do-the-bounty-system-work), если вы считаете, что ответ заслуживает дополнительной награды. –

+0

Кстати, я думаю, что это выглядело бы намного чище с помощью '.map'. –