Как использовать redux-сагу с функцией асинхронного обратного вызова

Я хочу использовать эффект вызова redux-saga yield с асинхронной функцией, результатом которой является обратный вызов. (в этом случае fingerprintjs, но это общий случай)

Это асинхронная функция, которую я хочу уточнить:

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

Проблема в том, что я хочу выполнить эту функцию через сагу, но она всегда зависает при вызове yield.

Я пробую много способов:

import Fingerprint2 from 'fingerprintjs2';

const func = new Fingerprint2().get;
const res = yield call(func);

Также попробуйте так:

import Fingerprint2 from 'fingerprintjs2';

const func = new Fingerprint2().get;
const a = yield call(func, (fingerprint, result) => ({
  fingerprint,
  result
}));

А вот так:

import Fingerprint2 from 'fingerprintjs2';

let res = yield call(new Fingerprint2().get(), (fingerprint, result) => ({
  fingerprint,
  result
}));

Кто-нибудь знает об идее или как достичь своей цели?

Спасибо!

2 ответа

yield может принять обещание.

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

Для тех, кто хочет ответить на вопрос, есть варианты сервал:

с cps:

const { result, components } = yield cps(cb => new Fingerprint2().get((result, components) => cb(null, { result, components })))

с обещанием:

 function* rootSaga(){
// Wrapping you function into a promise
const promise = new Promise((resolve, reject) => {
  new Fingerprint2().get((result, components) => {
  resolve({ result, components })
})
})

 // Yield the promise And redux-saga will return the resolved value when the promise resolves
 const { result, components } = yield promise
// do some stuff about  result and components ...
}

кредит: редукс-сага Github

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