Намеренно не возвращает обещание Bluebird

#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() , write Promise_.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. У меня нет хорошего объяснения, но я все еще получаю то же предупреждение….