5

我想做一个函数来获取fingerprint2.js的结果

Fingerprint2 是一个现代且灵活的浏览器指纹库http://valve.github.io/fingerprintjs2/ 用法:

new Fingerprint2().get(function(result, components){
  console.log(result); //a hash, representing your device fingerprint
  console.log(components); // an array of FP components
});

无论我为获得 Fingerprint2 之外的结果所做的任何尝试new Fingerprint2().get(function(result, components){都失败了。像 Global vars 和 cookie 因为 Fingerprint2().get(...) 是异步的 可以像函数一样编写来获取指纹2结果吗?例如:

var secure = getmefingerprint2();
4

3 回答 3

3

利用 ES2017 特性async/await,你可以Fingerprint2.getPromise()这样使用:

(async () => {
    const components = await Fingerprint2.getPromise();
    const values = components.map(component => component.value);
    const murmur = Fingerprint2.x64hash128(values.join(""), 31);
    console.log('fingerprint:', murmur);
)()

请参阅Fingerprint2 Doc中的get 和 getPromise

于 2020-01-28T02:44:45.390 回答
1

这应该是一个评论,但它有点长。

即使有可能,您也将绕过已发布的 api,这意味着您必须维护原始代码的一个分支。您还需要同步调用该功能 - 并且指纹js2 出于良好且明显的原因异步运行。

你似乎在问一个XY 问题

您应该如何处理它取决于您在捕获指纹后打算如何处理它。

于 2016-10-08T13:19:04.383 回答
0

你不能让异步代码完全同步。但是,您可以使用async/await,如果您的目标浏览器支持,但它不是普遍支持的。此外,它只在async函数内部看起来是同步的

基本思想是返回一个promise,然后await它在一个async函数中:

const getmefingerprint2 = async () => {
  const secure = await (new Promise(resolve => {
    new Fingerprint2().get((result, components) => resolve(result) )
  }))
  // do things with secure, whatever you return is thenable
  return secure
}

该函数可以这样调用(因为 Promises):

getmefingerprint2().then(result => {
  // do stuff with result
})

而且,在 async 函数内部,您可以secure像同步获得它一样对待。

如果你真的想让你的异步代码表现得更加同步(如果你讨厌异步,可能对其他异步代码也有用),你可以将所有代码包装在一个async函数中,然后await用来获取异步内容:

const getFingerprint = () => new Promise(resolve => {
  new Fingerprint2().get((result, components) => resolve(result) )
})

const main = async () => {
  // do some of your app here
  const secure = await getFingerprint()
  // do more stuff here
}

main()

或作为IIFE

(async() => {
  // do some of your app here
  const secure = await getFingerprint()
  // do more stuff here
})()

这些只是一种 hacky 变通方法,可以让您摆脱异步代码的负担,这可能值得了解,因为它会成为一个更好的应用程序。如果您将代码重构为仅包含依赖于secure回调内部的内容,那么一旦您习惯了它,您将获得更好的性能、畅通的 UI 以及更容易推理的更动态的流程。

于 2017-04-07T18:22:32.053 回答