我正在编写一些调用DuckDuckGo API的代码,使用来自mongoDB集合的数据构建查询字符串。我希望在每次API调用之前暂停几秒钟,以免过于频繁地命中服务器。这是我的代码,但是,我发现在等待一秒后,所有的API调用都会立即生成。
我犯了什么错误/如何写这个以便每次通话之间有一秒钟的暂停?
collection.find({}).each(function(err, item) {
if (item === null) {
db.close();
} else {
setTimeout(function() {
var req = http.request({
host: 'api.duckduckgo.com',
path: '/?q=' + item.letters + '&format=json&pretty=1'
}, callback).end();
}, 1000);
}
});
答案 0 :(得分:1)
这样的事情怎么样:
var i = 1;
collection.find({}).each(function(err, item) {
if (item === null) {
db.close();
} else {
setTimeout(function() {
var req = http.request({
host: 'api.duckduckgo.com',
path: '/?q=' + item.letters + '&format=json&pretty=1'
}, callback).end();
}, 1000*i);
i++;
}
});
此处,i
表示请求的索引。您只需将等待时间(在本例中为1000
)乘以索引,以使每个额外请求的时间比前一个要长。
答案 1 :(得分:0)
您可以使用setInterval执行代码,在每次调用之间使用固定时间延迟而不是setTimeout,如下所示:
collection.find({}).each(function(err, item) {
if (item === null) {
db.close();
} else {
setInterval(function() {
var req = http.request({
host: 'api.duckduckgo.com',
path: '/?q=' + item.letters + '&format=json&pretty=1'
}, callback).end();
}, 1000);
}
});