我的代码如下:(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 null
中then()
没有<?= Html::csrfMetaTags() ?>
,我怎么能让蓝鸟忽略警告?
我不想禁用警告,因为它非常有用。
答案 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);
});
}