#javascript #typescript #promise #bluebird
#javascript #typescript #обещание #bluebird
Вопрос:
У меня есть фрагмент кода ниже. Хотите вызвать обратный вызов, который может вернуть обещание. Разрешите это. В случае, если обещание не выполнено, запишите его. Вызывающий НЕ должен знать обо всем этом и должен вернуться, не дожидаясь выполнения обещания. Вот почему я не возвращаю обещание. Это вызывает следующую ошибку:
(node:21146) Warning: a promise was created in a handler at internal/timers.js:456:21 but was not returned from it, see http goo.gl/rRqMUw
at Function.Promise.cast (bluebird/js/release/promise.js:225:13)
Я прочитал документы, и они рекомендуют возвращать null, чтобы предотвратить появление предупреждения. Тем не менее, предупреждение все равно появляется. Кроме того, не хотите отключать предупреждение глобально.
private _trigger(cb : () => Resolvable<any>)
{
try
{
const res = cb();
const prom = Promise.resolve(res);
prom.catch(reason => {
this.logger.error("ERROR: ", reason);
})
}
catch(reason)
{
this.logger.error("ERROR: ", reason);
}
return null;
}
Комментарии:
1. Что произойдет, если вы добавите обработчик без операции
.then()
?2. Там, где установлена Bluebird, сохраняйте глобальную ссылку на собственное обещание javascript, скажем
Promise_
, затем в_trigger()
, writePromise_.resolve(res)
.3. Я попробовал .then(() => null); как было предложено, но не помогло
4. @Roamer-1888, не могли бы вы подробнее остановиться на этом?
5. @rubenhak, это просто предложение. Я его не тестировал. Вы должны быть в состоянии опробовать идею из того, что я сказал выше. Это не сложно.
Ответ №1:
Внутреннее обещание должно быть преобразовано в значение null
, чтобы отключить предупреждение — это сообщит Bluebird «Обещание не возвращается, но поскольку оно принимает значение null, оно не содержит полезного результата, так что это преднамеренно«; его возврат не даст вызывающей стороне полезных данных. Вы можете сделать что-то вроде:
const prom = Promise.resolve(res)
.catch(reason => {
this.logger.error("ERROR: ", reason);
})
.then(() => null);
Комментарии:
1. Означает ли это, что мне не нужен «return null;» внутри вызывающей функции?
2. Правильно, поскольку
_trigger
это не внутри обещания.then
, вам не нужноreturn null
из него3. У меня нет хорошего объяснения, но я все еще получаю то же предупреждение….