2013-09-05 73 views
1

我試圖將一個API請求與一個偏移量變量分開,以便在不等待整個請求結束的情況下獲得部分結果。 基本上我會爲前100個值做一個API請求,然後我再增加100個,直到達到最後。偏移量只是起點。具有回調函數的異步API請求

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

我不明白是爲什麼,如果我改變「while循環」與「如果條件」,一切正常,但用「而」這在一個無限循環」進入。另外,是它是正確的方式來發出部分請求 - >等待響應 - >處理響應 - >跟隨下一個請求?

回答

1

while循環將幾乎無限期地調用contextio_request(),因爲這會導致異步調用不會立即返回。

一個更好的方法可能是寫一個遞歸方法,調用contextio_request(),在該方法內喲ü檢查是否響應主體長度小於100

基本邏輯:

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

而且,它是正確的方法,使部分請求 - >等待響應 - >過程中的響應 - >跟隨下一個請求?

我看不出爲什麼沒有。

+0

這正是我想要做的。非常感謝! – parov