Как вернуть данные с помощью Fetch API в вызывающую функцию?

Я экспериментирую с redux saga, у меня проблема с получением данных из моего API. Я изменил свой API, использую fetchjs, и у меня возникли некоторые проблемы.

Проблема в том, что данные не возвращаются вызывающей функции, но API получает данные.

Вот мой код саги:

/* 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

Я удалил try catch и удалил yield, поставленный для исключения, но я все еще получаю те же ошибки, похоже, проблема связана с первым положением yield.


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