Что произойдет, если я отклоню/разрешу несколько раз в Kriskowal q?
Я изучаю шаблон promises и используя kriskowal q для 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 истинно?
Будет ли процесс исполнения отклоняться посредством разрешения и обе метода обетования вызываться в разное время, создавая таким образом ошибку?
Должен ли я избегать многократного вызова reject/resolve?
Ответы
Ответ 1
Так как promises может разрешаться только раз (для выполнения или отклонения), первая победа в разрешении и любые дальнейшие вызовы будут проигнорированы. Из документов:
Во всех случаях, когда обещание разрешено (т.е. выполнено или отклонено), разрешение является постоянным и не может быть reset. Попытка вызвать решение, отклонить или уведомить, если обещание уже разрешено, будет no-op.
Должен ли я избегать многократного вызова reject/resolve?
Вы даже можете создать свое приложение, позволяющее двум методам "расы" друг против друга разрешать отложенные, но в целом его следует избегать, чтобы уменьшить путаницу читателя.