对于支持任何promise库的库,但想知道何时指定Bluebird,它应该以哪种方式验证它? -
var promise = require('any-promise-library');
function isBluebird(lib) {
// do the checks
}
console.log(isBluebird(promise));
答案 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承诺的内容将有所不同。