Отвечая на ваш вопрос одним словом,
Как это можно исправить, чтобы вывести предупреждение?
Включение длинных трассировок стека .
const Bluebird = require('bluebird');
Bluebird.config({
warnings: true,
longStackTraces: true
})
Bluebird.resolve(1)
.then(() => {
Bluebird.resolve(2); // should warn about forgotten return
})
.then(two => console.log(two));
Теперь вы должны получить новое демо , которое сообщит вам об этой ошибке:
(node:65) Warning: a promise was created in a handler at evalmachine.<anonymous>:16:14 but was not returned from it, see http://bluebirdjs.com/docs/warning-explanations.html#warning-a-promise-was-created-in-a-handler-but-was-not-returned-from-it
at Function.Promise.cast (/home/runner/node_modules/bluebird/js/release/promise.js:196:13)
undefined
promise.js file:
Promise.cast = function (obj) {
var ret = tryConvertToPromise(obj);
if (!(ret instanceof Promise)) {
ret = new Promise(INTERNAL);
ret._captureStackTrace(); //promise.js:196:13
ret._setFulfilled();
ret._rejectionHandler0 = obj;
}
return ret;
};
Помните, что в Node.js вы можете настроить предупреждения и длинные трассировки стека для всего процесса, используя переменные среды.
Переход к исходному коду bluebird
var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
(debugging || util.env("BLUEBIRD_WARNINGS")));
var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
(debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));
var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
(warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));
И
Promise.config = function(opts) {
opts = Object(opts);
if ("longStackTraces" in opts) {
if (opts.longStackTraces) {
Promise.longStackTraces();
} else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
disableLongStackTraces();
}
}
if ("warnings" in opts) {
var warningsOption = opts.warnings;
config.warnings = !!warningsOption;
wForgottenReturn = config.warnings;
if (util.isObject(warningsOption)) {
if ("wForgottenReturn" in warningsOption) {
wForgottenReturn = !!warningsOption.wForgottenReturn;
}
}
}
if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
if (async.haveItemsQueued()) {
throw new Error(
"cannot enable cancellation after promises are in use");
}
Promise.prototype._clearCancellationData =
cancellationClearCancellationData;
Promise.prototype._propagateFrom = cancellationPropagateFrom;
Promise.prototype._onCancel = cancellationOnCancel;
Promise.prototype._setOnCancel = cancellationSetOnCancel;
Promise.prototype._attachCancellationCallback =
cancellationAttachCancellationCallback;
Promise.prototype._execute = cancellationExecute;
propagateFromFunction = cancellationPropagateFrom;
config.cancellation = true;
}
if ("monitoring" in opts) {
if (opts.monitoring && !config.monitoring) {
config.monitoring = true;
Promise.prototype._fireEvent = activeFireEvent;
} else if (!opts.monitoring && config.monitoring) {
config.monitoring = false;
Promise.prototype._fireEvent = defaultFireEvent;
}
}
return Promise;
};
По умолчанию трассировки длинных стеков, предупреждения, мониторинг и отмена отключаются, помещая их false
в производственную среду. Они обнаруживаются и автоматически включаются при включении отладчика в среде разработки.
Я предлагаю вам еще раз просмотреть документацию Bluebird .
Promise.config
Promise.config(Object {
warnings: boolean=false,
longStackTraces: boolean=false,
cancellation: boolean=false,
monitoring: boolean=false
} options) -> Object;
Настройка трассировки длинных стеков, предупреждений, мониторинга и отмены. Обратите внимание, что, хотя false
является значением по умолчанию, здесь может быть обнаружена среда разработки, которая автоматически разрешает длинные трассировки стека и предупреждения.
Promise.config({
// Enable warnings
warnings: true,
// Enable long stack traces
longStackTraces: true,
// Enable cancellation
cancellation: true,
// Enable monitoring
monitoring: true
});
Вы можете настроить предупреждение для проверки забытых операторов возврата с помощью wForgottenReturn
:
Promise.config({
// Enables all warnings except forgotten return statements.
warnings: {
wForgottenReturn: false
}
});
wForgottenReturn
- единственный тип предупреждения, который можно настроить отдельно. Соответствующий ключ переменной среды - BLUEBIRD_W_FORGOTTEN_RETURN
.
В Node.js вы можете настроить предупреждения и длинные трассировки стека для всего процесса, используя переменные среды:
BLUEBIRD_LONG_STACK_TRACES=1 BLUEBIRD_WARNINGS=1 node app.js
Обе функции включаются автоматически, если установлена переменная окружения BLUEBIRD_DEBUG
или если переменная окружения NODE_ENV
равна "development"
.
Использование значения 0
явным образом отключит функцию, несмотря на отладочную среду, в противном случае ее активируют:
# Warnings are disabled despite being in development environment
NODE_ENV=development BLUEBIRD_WARNINGS=0 node app.js
Возможно, вы захотите проверить этот официальный источник от одного из авторов Bluebird