2017-09-19 1 views
1

Comment mettre l'information dans la variable 'data' dans la nouvelle variable 'newData'?Comment manipuler un objet de données Twilio? nodeJS

var accountSid = '12345'; 
var authToken = "12345"; 
var client = require('twilio')(accountSid, authToken); 

app.get("/results", function(req,res){ 
    var query = req.query.search 
    var newData; 

    // Retrieve list of messages 
    client.messages.list(query, function(err, data) { 
     if(err){console.log(err)} 
     else { 
     // Pass info into 'newData' 
     newData = data; 
     } 
    }); 

console.log(newData); 

res.render("results", {data: newData}); 
}); 

Le code ci-dessus donne 'newData' étant indéfini.

Si faire:

 else { 
     // Render raw 'data' 
     res.render("results", {data: data}); 
     } 

Le code fonctionne très bien. Cependant, je veux manipuler les données en dehors de de la fonction.

+0

Envoyez les données à. function qui a un callback ou utilise '' '' Promises''' – Wainage

+0

Ça sent comme une condition de concurrence, mais je ne suis pas vraiment sûr de savoir comment aider sans en savoir plus sur la fonction 'client.messages.list()'. – JaeGeeTee

+0

Pourquoi avez-vous besoin de manipuler les données en dehors de la fonction? Puisque la fonction 'list' de Twilio renvoie des données dans un rappel, vous n'aurez jamais les données immédiatement après les avoir appelées. – gregnr

Répondre

1

Déplacez votre utilisation de newData dans le rappel où il est défini:

app.get("/results", function (req,res){ 
    var query = req.query.search 
    var newData; 

    // Retrieve list of messages 
    client.messages.list(query, function (err, data) { 
    if (err) { console.log(err); } 
    else { 
     newData = data; 
     res.render("results", { data: newData }); 
    } 
    }); 
}); 

Le problème est que newData n'est pas peuplée jusqu'à ce que le rappel fonctionne, mais vous essayez d'utiliser la valeur avant que cela arrive .

Voici votre code d'origine avec des commentaires expliquant ce qui se passe dans quel ordre:

app.get("/results", function (req,res){ 
    // 1. This code runs first. 
    var query = req.query.search 
    var newData; 

    // 2. This call is made second. 
    client.messages.list(query, function (err, data) { 
    // 5. This code runs fifth, after the list call has completed. 
    if (err) { console.log(err); } 
    else { 
     // Pass info into 'newData' 
     newData = data; 
    } 
    }); 

    // 3. This console.log is third. 
    console.log(newData); 

    // 4. This runs fourth, at which point the HTTP response has been sent. 
    res.render("results", { data: newData }); 
}); 

Espérons que montre clairement pourquoi votre appel res.render appartient à l'intérieur du rappel. Vous voulez qu'il s'exécute une fois l'appel list terminé.

0

Offres d'être Async. Fondamentalement, votre rendu est rendu avant qu'il ait le contenu du rappel.