2017-06-12 5 views
0

Ich experimentiere mit Redux Saga, ich habe ein Problem versucht, Daten von meiner API zu holen. Ich änderte meine API und ich benutze fetchjs und ich geriet in Schwierigkeiten.Wie gibt man Daten mit Fetch API an eine aufrufende Funktion zurück?

Das Problem besteht darin, dass die Daten nicht an die aufrufende Funktion zurückgegeben werden, sondern dass die API Daten empfängt.

Hier ist meine Saga Code:

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

Hier ist meine API-Code:

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); 
    }) 
}; 

Ich glaube, es hat etwas mit hole ich bin mit zu tun hat js (falsche Art und Weise). Ich konnte keine Lösungen finden, die helfen könnten.

UPDATE wenn Rückruf verwenden,

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); 
    } 
}) 

Wenn ich dies tun, werden die Daten zurück, aber ich erhalte einige Ausnahme von Ausbeute

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 

Ich habe entfernt den Versuch zu fangen und entfernt die Ausbeute für Ausnahme, aber ich bekomme immer noch die gleichen Fehler scheint das Problem mit der fi ist erster Ertrag gesetzt.

+0

den Rückruf verwenden 'cb' Daten zurückgeben –

+0

@ p0k8_ ich nur mit der getestet cb, und ich aktualisierte die Antwort oben, ich habe immer noch Probleme mit dem Empfang von Daten, irgendwelche Vorschläge? –

Antwort

0

nicht sicher, welche Version von redux-saga Sie verwenden, aber put, call, fork usw. befinden sich jetzt in einem anderen Ordner

import { put, call, takeEvery } from 'redux-saga/effects'; 
Verwandte Themen