2013-08-13 1 views
25

Я изучаю шаблон обещаний и используя д kriskowal в для Node.js,Что произойдет, если я отклоняю/разрешаю несколько раз в цикле Крисковаля?

имея этот фрагмент:

var deferred = Q.defer(); 
try { 
    messageData = JSON.parse(message); 
} catch (e) { 
    global.logger.warn('Error parsing JSON message.'); 
    deferred.reject(e); 
} 
... 
if (some_reason) 
    deferred.resolve(something); 
... 
return deferred.promise; 

Что делать, если и анализатор не может и some_reason верно?

Будет ли процесс исполнения отклоняться посредством решения и метод обеим обещаниям в разное время, что приведет к возникновению ошибки?

Должен ли я избегать многократного отклонения/разрешения?

ответ

38

С promises can only resolve once (либо выполнено , либо отклонено), первая победа в разрешении и любые дальнейшие вызовы будут проигнорированы. От the docs:

Во всех случаях, когда решенных обещание (т.е. либо выполнены или отклонены), разрешение является постоянным и не может быть сброшен. Попытка вызвать решение, отклонить или уведомить, если обещание уже разрешено, будет no-op.

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

Вы можете даже создать свое приложение, позволяющее двум методам «расы» друг против друга решать проблему, но в целом следует избегать, чтобы уменьшить путаницу читателя.

+0

Я не знаю о гонке, я использовал jQuery отложенные именно для этого. например перейдите к следующему экрану, когда пользователь нажмет или когда закончится время. "Что наступит раньше". Мне кажется странным, что библиотеки, такие как Kew.js, на самом деле бросают ошибку при попытке решить дважды. :( –

+0

@ bfred.it: Да, вы * можете * сделать это. Но лучше явно делать Q.race (getNextUserClick(), Q.timeout (...)), затем (nextScreen) ', чем [с одним отложенный] (https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern) и вручную разрешая это несколько раз. – Bergi

+0

'Race' интересен, но kew.js doesn ' На самом деле это, к сожалению. –

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