蓝鸟承诺:如何避免嵌套函数中的失控承诺警告?

时间:2018-05-15 05:43:08

标签: javascript promise bluebird

我的代码如下:(node.js code)

'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()执行后台工作,因此无需返回承诺。但是由于它创建了一个promise,当函数在then()中调用时,return null中没有明确的then(),bluebird会向控制台输出以下警告。 '警告:承诺是在处理程序中创建的,但未从中返回'。

这有些不公平,因为调用者不需要知道该函数使用了promise。如果调用者的return nullthen()没有<?= Html::csrfMetaTags() ?> ,我怎么能让蓝鸟忽略警告?

我不想禁用警告,因为它非常有用。

2 个答案:

答案 0 :(得分:1)

一种可能性是单独添加背景.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的其他消费者可能使用它在需要时返回的承诺。

答案 1 :(得分:0)

取决于:

  • doBackgroundJob正在执行异步操作,因此它应该像往常一样返回一个promise,让调用者知道它何时完成。即使它已经完成所有错误处理并保证只履行承诺。调用者知道它返回一个promise,会在return null回调中使用then来避免警告。

    function doBackgroundJob() {
      return backgroundJob().catch(console.error);
    }
    
  • 如果调用者不知道doBackgroundJobb正在做什么,您可以异步创建promise(以便Bluebird不会注意到)并且不返回任何内容(以便调用者不会注意到):

    function doBackgroundJob() {
      process.nextTick(() => {
        // this is an intentional runaway promise.
        backgroundJob().catch(console.error);
      });
    }