将 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 是异步的。所以需要等待结果才能使用。