蓝鸟承诺泄漏警告

Bluebird promise leak warnings

在 public 库中 spex that I wrote awhile ago and that proved to be very reliable, I've been struggling to locate the reason why BluebirdWarning: a promise was created in a handler but was not returned from it 警告我。

在一次又一次尝试解决之后,我几乎放弃了,现在准备将最高赏金放在解决方案上。

完成测试应用程序:

'use strict';

var promise = require('bluebird');
var spex = require('spex')(promise);

function factory(index) {
    if (index < 2) {
        return promise.resolve(index);
    }
}

spex.sequence(factory)
    .then(data=> {
        console.log("success");
    })
    .catch(error=> {
        console.log("error");
    });

完整的控制台输出:

Warning: a promise was created in a handler but was not returned from it
    at Object.factory (D:\NodeJS\tests\test4.js:8:24)
    at loop (D:\NodeJS\tests\node_modules\spex\lib\utils.js:69:44)
    at Object.resolve (D:\NodeJS\tests\node_modules\spex\lib\utils.js:90:9)
    at loop (D:\NodeJS\tests\node_modules\spex\lib\ext\sequence.js:106:28)
    at next (D:\NodeJS\tests\node_modules\spex\lib\ext\sequence.js:160:25)
    at $utils.resolve.call.reject.index (D:\NodeJS\tests\node_modules\spex\lib\ext\sequence.js:144:25)
    at loop (D:\NodeJS\tests\node_modules\spex\lib\utils.js:86:17)
    at D:\NodeJS\tests\node_modules\spex\lib\utils.js:80:25
    at processImmediate [as _immediateCallback] (timers.js:383:17)
From previous event:
    at loop (D:\NodeJS\tests\node_modules\spex\lib\utils.js:77:22)
    at Object.resolve (D:\NodeJS\tests\node_modules\spex\lib\utils.js:90:9)
    at loop (D:\NodeJS\tests\node_modules\spex\lib\ext\sequence.js:106:28)
    at D:\NodeJS\tests\node_modules\spex\lib\ext\sequence.js:184:9
From previous event:
    at promise (D:\NodeJS\tests\node_modules\spex\lib\index.js:96:24)
    at Object.sequence (D:\NodeJS\tests\node_modules\spex\lib\ext\sequence.js:100:12)
    at Object.sequence (D:\NodeJS\tests\node_modules\spex\lib\ext\sequence.js:193:29)
    at Object.<anonymous> (D:\NodeJS\tests\test4.js:12:6)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:139:18)
    at node.js:968:3

success

解决方案(如 here 所建议)是 return null 来自 onFulfilled 没有任何其他功能的 return。

例如:

.then(data=> {
    console.log("success");
})

大概应该是:

.then(data=> {
    console.log("success");
    return null;
})