在不调用“then”的情况下解决 Promise

Ale*_*lls 5 javascript node.js es6-promise

我有这段代码,它是我为名为 Poolio 的 NPM 模块编写的一个小型 API 的一部分。对于那些支持错误优先回调和承诺的人来说,我的问题似乎是一个常见问题——我们如何在保持一致的 API 和一致的 API 返回值的同时支持两者?例如,如果我有条件地从我的 API 返回一个 promise,取决于我的 lib 的使用者是否提供回调,在我看来这有点尴尬。

lib 的使用者可以提供回调或使用 Promise then 函数,但不能同时提供两者。

这是我的库导出的一个函数,我想承诺:

Pool.prototype.any = function (msg, cb) {

    var workId = this.counter++;
    var self = this;

    return new Promise(function (resolve, reject) {

        if (typeof cb === 'function') {
            self.resolutions.push({
                workId: workId,
                cb: cb
            });
        }
        else {
            self.resolutions.push({
                workId: workId,
                resolve: resolve,
                reject: reject
            });
        }

        if (this.available.length > 0) {
            var cp = this.available.shift();
            cp.workId = workId;
            cp.send(msg);
        }
        else {
            self.msgQueue.push({
                workId: workId,
                msg: msg
            });
        }
    });

};
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 如果用户在原始函数参数中提供回调函数,我如何在不调用“then”的情况下解决承诺?对不起,这很难解释,但希望你能理解。

还有一个有趣的问题: 从不解决承诺会导致内存泄漏吗?

sle*_*man 2

实际上非常简单。只有您可能错过了它,因为它隐藏在混乱的代码中。

基本上你这样做:

var promise = new Promise(function (resolve, reject) { /*....*/});

if (typeof cb === 'function') {
    promise.then(cb);
} else {
    return promise;
}
Run Code Online (Sandbox Code Playgroud)