创建一个接受回调并返回 Promise 的 api

2024-01-03

因此,我正在尝试升级现有的 api 以支持 Promise,但我想保持向后兼容性。所以,假设这是我的 api:

module.exports = {

    deliverPost: function(callback) {

        someAsyncFunction(function(err) {

            if (err)
                console.log(err);

            callback(err);
        });
    }
}

太好了,我可以调用它并传递回调,一切正常。

现在我们用 Promise 做同样的事情:

var q = require('q');

module.exports = {

    deliverPost: function() {

        return q.nfcall(someAsyncFunction).catch(function(err) {

            console.log(err);
            throw err;
        });
    }
}

太好了,现在它返回一个承诺,但我的问题是,这个 api 的任何旧客户端都希望能够传入回调!

所以我真正需要的是这样的:

var q = require('q');

module.exports = {

    deliverPost: function(callback) {

        return q.nfcall(someAsyncFunction).catch(function(err) {

            console.log(err);
            throw err;

        }).attachNodeStyleCallback(callback);
    }
}

因此,新的调用者可以利用 Promise 支持,但如果您传入回调,一切仍然有效。

这是例如使用的模式jQuery.ajax-- 我怎样才能做同样的事Q.js?

这是一个实现attachNodeStyleCallback以供参考:

q.makePromise.prototype.attachNodeStyleCallback = function(callback) {

    if (!callback)
        return this;

    return this.then(function(result) {

        callback(null, result);
        return result;

    }, function(err) {

        callback(err);
        throw err;
    })
}

答案是使用promise.nodeify:

var q = require('q');

module.exports = {

    deliverPost: function(callback) {

        return q.nfcall(someAsyncFunction).catch(function(err) {

            console.log(err);
            throw err;

        }).nodeify(callback);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建一个接受回调并返回 Promise 的 api 的相关文章

随机推荐