Експериментирам с redux saga, имам проблем при опит да извлека данни от моя API. Промених моя API и използвам fetchjs и се натъкнах на някои проблеми.
Проблемът е, че данните не се връщат към извикващата функция, но API получава данни.
Ето моят код на Saga:
/* eslint-disable no-constant-condition */
import { put, call, takeEvery } from 'redux-saga';
import { delay } from 'redux-saga';
import RPC from "../../RPC";
export function* load_contacts() {
console.log("Called"); // This part is printed
try{
const data = yield call(RPC.execute("contact","search_read_path",[[],["name","picture"]],{})); // *this is the calling function. nothing is returned.
console.log("waiting for data",data); // this is not printed
yield put({type:"CONTACTS_LOADED",payload:data});
}
catch (e) {
yield put({type: "CONTACTS_LOAD_FAILED", message: e.message});
}
}
export default function* rootSaga() {
console.log(">> rootSaga");
yield takeEvery('LOAD_CONTACTS', load_contacts)
}
Ето моя API код:
module.exports.execute=function(model,method,args,opts,cb) {
console.info("rpc.execute",model,method,args,opts);
if (!_rpc_base_url) throw "RPC base url is undefined";
var params=[model,method];
params.push(args);
if (opts) {
params.push(opts);
}
var headers={
"Accept": "application/json",
"Content-Type": "application/json",
};
if (_database) headers["X-Database"]=_database;
if (_schema) headers["X-Schema"]=_schema;
fetch(_rpc_base_url+"/json_rpc",{
method: "POST",
headers: headers,
body: JSON.stringify({
id: (new Date()).getTime(),
method: "execute",
params: params
}),
})
.then((response) => response.json())
.then((data)=>{
console.log(data); // data is printed here
return data} // doesnot return
)
.catch((err) => {
alert("upload error: "+err);
if (result_cb) result_cb(err,null);
})
};
Вярвам, че има нещо общо с това, че използвам fetch js (неправилен начин). Не можах да намеря никакви решения, които биха могли да помогнат.
АКТУАЛИЗИРАНЕ, ако използвате обратно извикване,
export function* load_contacts() {
console.log("Called")
try{
const data ={};
yield call(RPC.execute("contact","search_read_path",[[],["name","picture"]],{},(err,data)=>{
if (err){
alert(err);
return
}
console.log("data inside is ",data)
data = data
}));
console.log("waiting for data",data)
yield put({type:"CONTACTS_LOADED",payload:data}); // this is called before the data is fetched causing error
}
catch (e) {
yield put({type: "CONTACTS_LOAD_FAILED", message: e.message});
}
}
RPC:
.then((response) => response.json())
.then((data)=>{
if (data.error) {
if (cb) cb(data.error.message,null);
} else {
//console.table(data.result);
if (cb) cb(null,data.result);
}
})
Ако направя това, данните се връщат, но получавам някакво изключение от yield put
bundle.js:17692 uncaught at rootSaga
at takeEvery(LOAD_CONTACTS, load_contacts)
at load_contacts
TypeError: (0 , _reduxSaga.put) is not a function
at load_contacts$ (http://localhost:8088/static/bundle.js:50254:47)
at tryCatch (http://localhost:8088/static/bundle.js:93097:40)
at Generator.invoke [as _invoke] (http://localhost:8088/static/bundle.js:93335:22)
at Generator.prototype.(anonymous function) [as next] (http://localhost:8088/static/bundle.js:93149:21)
at next (http://localhost:8088/static/bundle.js:48139:27)
at proc (http://localhost:8088/static/bundle.js:48098:3)
at runForkEffect (http://localhost:8088/static/bundle.js:48374:19)
at runEffect (http://localhost:8088/static/bundle.js:48261:872)
at next (http://localhost:8088/static/bundle.js:48143:9)
at currCb (http://localhost:8088/static/bundle.js:48215:7
Премахнах опитния улов и премахнах yield put за изключение, но все още получавам същите грешки, изглежда проблемът е с първия yield put.
cb
, за да върнете данни - person p0k8h   schedule 12.06.2017