Как да върна данни с помощта на Fetch API към извикваща функция?

Експериментирам с 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.


person Sijan Shrestha    schedule 12.06.2017    source източник
comment
използвайте обратното извикване cb, за да върнете данни   -  person p0k8h    schedule 12.06.2017
comment
@p0k8_ току-що тествах с cb и актуализирах отговора по-горе, все още имам проблем с получаването на данни, някакви предложения?   -  person Sijan Shrestha    schedule 12.06.2017


Отговори (1)


Не съм сигурен коя версия на redux-saga използвате, но put, call, fork и т.н. вече са в друга папка

import { put, call, takeEvery } from 'redux-saga/effects';
person Ematipico    schedule 12.06.2017