2017-07-26 1 views
0

Je suis nouveau dans fetch et react.js et, fondamentalement, dans javascript, j'essaye de créer une nouvelle ligne dans une table et je récupère juste une ID (ensuite), le problème est que temp alors domaine est en train de changer, mais sa ne change pas en dehors d'elle, bien que je l'ai définie comme variable de niveau de fonctionMise à jour de la variable de niveau fonction dans une requête d'extraction

handleAddRow({ newRowIndex }) { 
     var temp = null; 

     /////////////////////////////////////// updating records in db 
     fetch(`${config.serverUrl}/criteriaAPI`, 
     { 
      method: "POST", 
      dataType: 'json', 
      headers: { 
        'Accept': 'application/json; charset=UTF-8', 
        'Content-Type': 'application/json; charset=UTF-8' 
       } 
     }) 
     .then(function(res){ return res.json(); }) 
     .then(function(data){ temp = data._id ;alert(temp)}) 
     ////////////////////////////////////// 
     console.log(temp); 
     const newRow = { 
      _id: temp, 
      criteria_id: '', 
      securityCriteria: '', 
      description: '', 
     }; 
     let rows = this.state.rows.slice(); 
     rows = update(rows, {$push: [newRow]}); 
    }, 



console.log(temp) = > null 
alert(temp) = > id key : id value 
+1

Vous avez besoin pour supprimer "Access-Control-Allow-Origin": '*', "Access-Control-Allow-Credentials": true' de la partie 'headers' de votre appel de récupération. Ce sont des en-têtes de réponse, donc si vous les avez ajoutés à la demande parce que vous obtenez une erreur CORS, cela ne résoudra pas le problème. Si vous obtenez une erreur CORS, vous devez utiliser https://stackoverflow.com/posts/45325697/edit pour modifier/mettre à jour votre réponse afin d'inclure le message d'erreur exact que vous voyez dans la console devtools de votre navigateur. – sideshowbarker

+0

Vrai j'ai enlevé les deux lignes rien n'a changé par rapport à l'erreur CORS que j'ai utilisé pour l'obtenir du serveur node.js et c'était une erreur de les ajouter dans la demande de réaction de react.js je suppose que le commentaire posté est le problème – Ayman

Répondre

0

Résolu en séparant la demande d'extraction en une seule fonction, le problème était tel que mentionné ci-dessus la demande de récupération prend trop de temps, donc j'eu une autre fonction handleAddRow() d'attendre à l'aide de promesses

addRow(){ 
     return fetch(`${config.serverUrl}/criteriaAPI`, 
     { 
      method: "POST", 
      dataType: 'json', 
      headers: { 
        'Accept': 'application/json; charset=UTF-8', 
        'Content-Type': 'application/json; charset=UTF-8', 
       } 
     }) 
      .then(response => { 
       return response.json() 
      }) 
      .catch(err => { 
       console.log("fetch error" + err); 
      }); 

    }, 


    handleAddRow({ newRowIndex }) { 
     this.addRow() 
      .then(data => { 
       let row = this.createSingleRow(data); 
       console.log(row); 
       let rows = this.state.rows.slice(); 
       rows = update(rows, {$push: row}); 
       console.log(rows); 
       this.setState({ rows }); 
      }); 
    }, 

    createSingleRow(data) { 
     console.log('Entered into createRows'); 
     let temp = []; 
     temp.push({ 
       _id: data._id, 
       criteria_id: data.criteria_id, 
       securityCriteria: data.securityCriteria, 
       description: data.description 
      }); 

     //console.log(temp); 
     return temp; 
    }, 
2

il semble que le problème est que vous appelez console.log(temp) sans attendre les promesses précédentes pour terminer, c'est l'exécution n'est pas encore arrivée au point où vous affectez une valeur à la variable temp. Donc, la valeur de la variable temp change, mais cela arrive un certain temps après l'exécution de console.log(temp).

Si vous souhaitez utiliser la variable temporaire et qu'elle est remplie de manière asynchrone, vous devez y accéder dans les gestionnaires then correspondants.

+0

mais à ce sujet, mais le problème est que je ne peux pas accéder 'this.state.rows' dans le domaine' .then' parce qu'ils sont définis dans l'état initial de réaction – Ayman

+0

pensez-vous qu'il existe un moyen d'implémenter une fonction de rappel à l'intérieur du puis? – Ayman

+1

Garder le contexte de 'this' est un" problème "connu, il y a plusieurs façons de le résoudre, vérifiez cette question: https://stackoverflow.com/questions/20279484/how-to-access-the-correct-this- à l'intérieur-a-rappel – Amid