蓝鸟检测

时间:2016-06-28 14:54:06

标签: node.js bluebird

对于支持任何promise库的库,但想知道何时指定Bluebird,它应该以哪种方式验证它? -

  • 简单可靠
  • Bluebird
  • 的更高版本不太相符
var promise = require('any-promise-library');

function isBluebird(lib) {
    // do the checks
}

console.log(isBluebird(promise));

2 个答案:

答案 0 :(得分:2)

_promise0 是BlueBird库中的内部值,该库的作者也使用该属性来检查传递的对象是本机promise还是blueBird。

var Blue = require("bluebird");
var promise = new Blue(function() {})

function isBluebird(obj) {
    try {
        return {}.hasOwnProperty.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

console.log(isBluebird(promise))

或者,如果你想测试库......

var Blue = require("bluebird");

function isBluebird(promiseLibrary) {
    var promise = new promiseLibrary(function() {})

    try {
        return {}.hasOwnProperty.call(promise, "_promise0");
    } catch (e) {
        return false;
    }
}

console.log(isBluebird(Blue))

对于未来的重大变化 - 请与作者联系 - 内部方法 isAnyBluebirdPromise 是内部的 - 可以在有或没有任何理由的情况下进行更改

答案 1 :(得分:0)

如果您有权访问Bluebird(即如果您可以要求它)

这是一张“aPromise”与蓝鸟相同(版本)的检查:

function isBluebird(aPromise) { // aPromise is the class of Promise, not an instance
    var B;
    try { var B = require ('bluebird') } catch(e) {}
    if (!B) return false; // bluebird must be installed

    return aPromise.getNewLibraryCopy === B.getNewLibraryCopy
}

目前,如果aPromise是getNewLibraryCopy的结果,这也有效。但这并不能保证。

如果您希望将getNewLibraryCopy的结果视为不同,请比较aPromise.resolve === B.resolve

如果要测试承诺实例,可以比较aPromise.then === B.resolve().then。但这只适用于未经修改的蓝鸟。 getNewLibraryCopy承诺的内容将有所不同。