Обещание Bluebird: Как избежать предупреждения о безудержном обещании во вложенной функции? - PullRequest
0 голосов
/ 15 мая 2018

Мой код выглядит следующим образом: (код node.js)

'use strict';

var Promise = require('bluebird');

function promised()
{
    return Promise.resolve();
}

function backgroundJob()
{
    return Promise.resolve();
}

function doBackgroundJob()
{
    // this is an intentional runaway promise.
    backgroundJob()
    .catch(function (err)
    {
        console.log('error', err);
    });
}

function test()
{
    return promised()
    .then(function ()
    {
        doBackgroundJob();
        return null;  // without this, bluebird displays the warning
    });
}

doBackgroundJob() выполняет фоновую работу, поэтому ему не нужно возвращать обещание.Но поскольку он создает обещание, когда функция вызывается в then(), без явного return null в then(), bluebird выводит на консоль следующее предупреждение.«Предупреждение: обещание было создано в обработчике, но не было возвращено из него».

Это несколько несправедливо, так как вызывающей стороне не нужно знать, что функция использует обещание.Как я могу позволить bluebird игнорировать предупреждение без return null в then() в вызывающем абоненте?

Я не хочу отключать предупреждение, так как оно весьма полезно.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Это зависит от:

  • doBackgroundJob делает что-то асинхронное, поэтому оно должно вернуть обещание как обычно, чтобы сообщить вызывающему абоненту, когда оно закончится. Даже если он уже выполняет всю обработку ошибок и гарантирует только выполнение обещания. Звонящий, зная, что он возвращает обещание, будет использовать return null в then обратных вызовах, чтобы избежать предупреждения.

    function doBackgroundJob() {
      return backgroundJob().catch(console.error);
    }
    
  • Если вызывающий не должен знать, что делает doBackgroundJobb, вы можете создать обещание асинхронно (чтобы Bluebird не замечал) и ничего не возвращать (чтобы вызывающий не заметил):

    function doBackgroundJob() {
      process.nextTick(() => {
        // this is an intentional runaway promise.
        backgroundJob().catch(console.error);
      });
    }
    
0 голосов
/ 15 мая 2018

Одна возможность - добавить фон .then отдельно и вернуть только базовое обещание:

function test() {
  const prom = promised();
  prom.then(doBackgroundJob);
  return prom;
}

, в то время как doBackgroundJob возвращает обещание (которое продолжается для полученияотброшено в этой реализации ):

function doBackgroundJob() {
  // this is an intentional runaway promise.
  return backgroundJob()
    .catch(function(err) {
      console.log('error', err);
    });
}

, позволяющее другим потребителям doBackgroundJob возможно использовать обещание, которое оно возвращает при необходимости.

...