2016-10-04 2 views
0

J'ai un nœud js redis api où je lis les données de redis basé sur la clé et si présent pas le chercher d'une autre API, puis en insérant ces données dans redis. Aussi je pousse ces données dans une variable et à la fin de la foreach je veux renvoyer cette valeur à l'utilisateur final.insérer des données dans le tableau de redis à l'intérieur d'un foreach dans le noeud js

Le problème est que redis fonctionne en asynchrone et, par conséquent, ma variable de données est toujours vide. Comment puis-je contourner cela?

Voici la partie pertinente de mon code

between.forEach(function(entry) { 

    asyncTasks.push(function(callback){ 

     client.exists(id+entry, function(err, reply) { 
      if (reply === 1) { 
       client.get(id+entry, function(err, reply) { 
        var output = JSON.parse(reply); 
        data_output = data_output.concat(output); 
       }); 
      } else { 
       process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
       var slot_url = "https://" + username + ":" + password + "@testapi.foobar.com/1/timeslots?productId=" + id + "&fromDate=" + entry + "&toDate=" + entry; 
       request({ 

        url: slot_url, 
        json: true, 
        headers: headers 
       }, function(error, response, body) { 
        if (!error && response.statusCode === 200) { 
         var data = []; 
         try { 
          var temp = {}; 
          console.log(body); 
          body.data.forEach(function(tempslots) { 
           temp['date'] = tempslots['date']; 
           temp['timeslots'] = tempslots['timeslots']; 
           data = data.concat(temp); 
          }); 
          client.set(id+entry, JSON.stringify(data)); 
          data_output = data_output.concat(data); 
         } catch (err) { 
          console.log(err.message); 
         } 
        } else { 
         console.log("Something went wrong!! " + error.message); 
        } 
       }) 
      } 
      callback(); 
     }); 
    }); 

}); 

async.parallel(asyncTasks, function(){ 
    // All tasks are done now 
    result['data'] = data_output; 
    result['response'] = 1; 
    result['message'] = 'vacancies list fetched successfully!'; 
    res.json(result); 
}); 

});

la sortie est toujours comme ça {"data":[],"response":1,"message":"Capacity list fetched successfully!"} même si j'ai vérifié que le code est Beau et l'insertion de données correctement dans Redis

+0

Comme nous le savons noeud js async pour que votre travail foreach puis vos Radis données seront être défini .so la sortie de données est vide –

+0

@HimanshuGoyal Je le sais déjà, j'ai même utilisé async.parallel pour sortir de ce problème mais ça ne marchera toujours pas. Si possible, plz donner une solution –

+0

Vous pouvez utiliser la promesse http://stackoverflow.com/questions/25429522/q-promise-nodejs-how-to-resolve-in-loop –

Répondre

0
var totalLengthOfItem = between.length; 
for (var i = 0; i < totalLengthOfItem - 1; i++) { 
    var entry = between[i]; 
    client.exists(id + entry, function (err, reply) { 
     if (reply === 1) { 
      client.get(id + entry, function (err, reply) { 
       var output = JSON.parse(reply); 
       data_output = data_output.concat(output); 
       if (i == totalLengthOfItem - 1) { 
        response(data_output); 
       } 
      }); 
     } else { 
      process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
      var slot_url = "https://" + username + ":" + password + "@testapi.foobar.com/1/timeslots?productId=" + id + "&fromDate=" + entry + "&toDate=" + entry; 
      request({ 

       url: slot_url, 
       json: true, 
       headers: headers 
      }, function (error, response, body) { 
       if (!error && response.statusCode === 200) { 
        var data = []; 
        try { 
         var temp = {}; 
         body.data.forEach(function (tempslots) { 
          temp['date'] = tempslots['date']; 
          temp['timeslots'] = tempslots['timeslots']; 
          data = data.concat(temp); 
         }); 
         client.set(id + entry, JSON.stringify(data)); 
         data_output = data_output.concat(data); 
         if (i == totalLengthOfItem - 1) { 
          response(data_output); 
         } 
        } catch (err) { 
         console.log(err.message); 
        } 
       } else { 
        console.log("Something went wrong!! " + error.message); 
       } 
      }) 
     } 
    }); 

} 

function response(data_output) { 
    result['data'] = data_output; 
    result['response'] = 1; 
    result['message'] = 'Capacity list fetched successfully!'; 
    res.json(result); 
} 
}) 
+0

ne fonctionnera pas @HimanshuGoyal Je reçois l'erreur, 'ne peux pas envoyer l'en-tête après qu'ils sont envoyés' ce qui signifie que votre réponse de fonction est appelé plusieurs fois –

+0

Vous venez de suivre en utilisant console.log bcz je ne l'ai pas testé mais je pense que la réponse est appel une fois. –

+0

Nope se appelé plusieurs fois, pour chaque fois que la boucle fonctionne, étrange je suis à la recherche, mais je pense que la bonne façon de le faire est d'utiliser async –