将 Fingerprint2 结果保存在变量中
Save Fingerprint2 result in Variable
我正在使用 Fingerprint2.js(现代且灵活的浏览器指纹库,原始 fingerprintjs 的继承者 http://valve.github.io/fingerprintjs2/)
当我 console.log 在函数内部时,我得到哈希指纹。但是当我将该结果存储在某个变量中时,它会给出 'undifined'
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);
});
由此,我在我的控制台中看到了一个哈希码...但是如果我将 return 值存储到某些 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
代替 return 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 是异步的。所以需要等待结果才能使用。
我正在使用 Fingerprint2.js(现代且灵活的浏览器指纹库,原始 fingerprintjs 的继承者 http://valve.github.io/fingerprintjs2/)
当我 console.log 在函数内部时,我得到哈希指纹。但是当我将该结果存储在某个变量中时,它会给出 'undifined'
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);
});
由此,我在我的控制台中看到了一个哈希码...但是如果我将 return 值存储到某些 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
代替 return 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 是异步的。所以需要等待结果才能使用。