Как получить результат fingerprint2 как функцию

Я хочу сделать функцию, которая получит остаток 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(...) асинхронный. Может ли он быть написан как функция для получения результата fingerprint2? например:

var secure = getmefingerprint2();

2 ответа

Кредитное плечо с функцией 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);
)()

Смотрите get и getPromise в Fingerprint2 Doc

Это должен быть комментарий, но он немного длинный.

Даже если бы это было возможно, вы бы обошли опубликованный API, что означает, что вам придется поддерживать ветвь исходного кода. Вы также должны были бы вызвать функциональность синхронно - и fingerprintjs2 работает асинхронно по понятным и понятным причинам.

Вы, кажется, спрашиваете о проблеме XY

То, как вы должны это делать, зависит от того, что вы собираетесь делать с отпечатком пальца после того, как он был захвачен.

Вы не можете сделать асинхронный код полностью синхронным. Тем не менее, вы можете использовать async / await, если ваш целевой браузер имеет поддержку, но она не поддерживается повсеместно. Кроме того, это выглядит только синхронно внутри async функция

Основная идея состоит в том, чтобы вернуть обещание, а затем 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
})

но внутри асинхронной функции вы можете 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
})()

Это всего лишь хакерские обходные пути, которые позволяют вам избежать бремени асинхронного кода, который, возможно, стоит просто узнать, так как это сделает лучшее приложение. Если вы реструктурируете свой код, чтобы иметь только то, что зависит от secure внутри обратного вызова вы получите лучшую производительность, неблокированный пользовательский интерфейс и более динамичный поток, о котором достаточно просто думать, как только вы к этому привыкнете.

Другие вопросы по тегам