将指纹2结果保存在变量中



我正在使用Fingerprint2.js(现代灵活的浏览器指纹库,原始指纹 http://valve.github.io/fingerprintjs2/的继承者(

当我控制台时.log我在函数内部获得哈希指纹。 但是当我将该结果存储在某个变量中时,它会给出"未定义">

Fingerprint2.get(options, function (components) {
var values = components.map(function (component) { return component.value });
console.log('insideFun -> ' + x64hash128(values.join(''), 31));
return x64hash128(values.join(''), 31);
});

通过这个,我在控制台中看到了一个哈希代码......但是,如果我将返回值存储到某些var

则不起作用。如果我使用 asyn/await,它仍然执行控制台值但不存储在var

var guid = function guid() {
var fpid;
var options = {}
let fp = (async function() {
const components = await Fingerprint2.getPromise(options);
var values = components.map(function (component) { return component.value });
let fpid = x64hash128(values.join(''), 31);
return fpid;
})();
return fpid;
};
guid();

它给fpid is undefined.

有什么办法可以解决这个问题吗?

Fingerprint2.get

是一个异步函数(这就是为什么你需要提供对它的回调(;在该回调中执行return ...不会产生任何影响。

你可以改用getPromise来返回一个 Promise,并使用 async/await 使你的代码看起来像是同步的(即使它不是(:

// This function is asynchronous,
// it does not return a fp, but a Promise that will
// resolve to a fp
var guid = function guid() {
const options = {};
return Fingerprint2.getPromise(options)
.then(components => {
const values = components.map({ value } => value);
return x64hash128(values.join(''), 31);
});
};
// And then, there are 2 ways to use it:
// Method 1 - using `.then`
guid()
.then(fpid => { // When it's done
console.log(fpid); // Now you can use it
document.cookie = `fpid=${encodeURIComponent(fpid)}`;
});

// Method 2 - using `async/await`
(async function() {
const fpid = await guid();
console.log(fpid); // Now you can use it
document.cookie = `fpid=${encodeURIComponent(fpid)}`;
})();
// But this will never work:
// const fpid = guid();
// console.log(fpid); // Promise<pending>

执行此操作时的问题:

const fpid = guid();
console.log(fpid);

。是在检索指纹之前执行console.log。因为 FP2 是异步的。因此,您需要等待结果才能使用它。

相关内容

  • 没有找到相关文章

最新更新