Как использовать 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