2013-09-05 5 views
1

J'essaie de fractionner une requête API avec une variable offset afin d'avoir des résultats partiels sans attendre la fin de la requête entière. Fondamentalement, je fais une demande API pour les 100 premières valeurs, puis je l'augmente avec 100 de plus jusqu'à la fin. Le décalage n'est que le point de départ.Requêtes API asynchrone avec fonction de rappel

/*Node.js connector to Context.io API*/ 
var key = xxxxxx; 
var secret = "xxxxxxxxx"; 
var inbox_id = "xxxxxxxxx"; 
var end_loop = false; 
var offset = 6000; 

/*global ContextIO, console*/ 
var ContextIO = require('contextio'); 
var ctxioClient = new ContextIO.Client('2.0', 'https://api.context.io', { key: key, secret: secret }); 

while(end_loop === false) { 
    contextio_request(offset, function(response){ 
     if (response.body.length < 100) { console.log("This is the end "+response.body.length); end_loop = true; } 
     else { offset += 100; } 
     console.log("Partial results processing"); 
    }); 

};

/* Context.io API request to access all messages for the id inbox */ 
function contextio_request(offset, callback) { 
ctxioClient.accounts(inbox_id).messages().get({body_type: 'text/plain', include_body: 1, limit: 100, offset: offset}, function (err, response) { 
    "use strict"; 
    if (err) { 
     return console.log(err); 
    } 
    callback(response); 
}); 
}; 

Ce que je ne comprends pas pourquoi si je change le « while » avec un « si la condition », tout fonctionne, mais avec le « tout », il entre dans une boucle infinie ». En outre, est

Répondre

1

La boucle while appellera contextio_request() presque indéfiniment, car cela fait un appel asynchrone qui ne retournera pas immédiatement.

Une meilleure façon pourrait être d'écrire une méthode récursive qui appelle contextio_request(), à l'intérieur de cette méthode yo u vérifier si la longueur du corps de réponse est inférieur à 100.

logique de base:

function recursiveMethod = function(offset, partialCallback, completedCallback) { 
    contextio_request(offset, function(response) { 
     if (response.body.length < 100) { 
      completedCallback(...); 
     } else { 
      partialCallback(...); 
      recursiveMethod(offset, partialCallback, completedCallback); 
     } 
    }); 
}; 

Aussi, est-il la bonne façon de faire une demande partielle -> attendre la réponse -> traiter la réponse -> suivre à la prochaine demande?

Je ne vois pas pourquoi.

+0

C'est exactement ce que j'essayais de faire. Merci beaucoup! – parov

Questions connexes