嘗試使用Node.js的爲什麼我的offset變量的值保持爲零
var request = require('request');
var fs = require('fs');
var apiKey = 'my-key-here';
var offset = 0;
for (var i=0; i<5; i++) {
console.log('request #' + i + '...');
var requestURL = 'http://api.tumblr.com/v2/blog/blog.tumblr.com/posts/text?api_key='
+ apiKey
+ '&offset='
+ offset;
console.log(requestURL);
request(requestURL, function(error, response, body) {
if (!error && response.statusCode == 200) {
var resultAsJSON = JSON.parse(body);
resultAsJSON.response.posts.forEach(function(obj) {
fs.appendFile('content.txt', offset + ' ' + obj.title + '\n', function (err) {
if (err) return console.log(err);
});
offset++;
});
}
});
}
默認情況下,做一個簡單的tumblr刮刀,該API只返回一個最大的20個最新的帖子。我想要抓住所有的帖子。作爲測試,我想先獲得最新的100個,因此在循環聲明中獲得i<5
。
這樣做的竅門是使用offset
參數。例如,給定一個值爲20的offset
,API不會返回最新的20,而是返回從頂部21開始的帖子。
因爲我不能確定API會一直返回20個帖子,所以我使用offset++
來獲得正確的偏移號碼。
上面的代碼工作,但console.log(requestURL)
返回http://api.tumblr.com/v2/blog/blog.tumblr.com/posts/text?api_key=my-key-here&offset=0
五次。
所以我的問題是,爲什麼我的requestURL
中的offset
值仍然爲0,即使我已經添加了offset++
?
不是這個。您啓動一個請求,並期望它在循環進入下一次迭代之前完成。這些請求甚至在循環完成之後纔開始,這就是爲什麼'offset'對所有這些都是零的原因。你需要一個異步的for-each循環。 –
事情是我正在'appendFile'中寫入'offset'變量,並且它們在0到99的文本文件中正確顯示。 – hfz
這只是由於以相同順序發生的請求回調但不能保證,你不應該依賴它。 –