【发布时间】:2020-07-10 17:49:00
【问题描述】:
我正在学习 Node.js 并练习 API。我想从 twitch 获取有关游戏前 200 名流的数据。但是,由于限制是 100,所以我必须在 for 循环中执行两次请求。问题是竞态条件。当我请求 0-100 和 100-200 的数据时,我不知道哪个数据会先来。所以,我标记状态以记录哪个先出现,但它似乎无法正常工作。谁能指导我我的方法有什么问题?如何改进它?谢谢!
const request = require('request');
const process = require('process');
const args = process.argv[2];
let offset = 0;
let flag = false;
const clientID = 'agdn5682y521syqhwkdrqmw7ho6v7d';
function getGameInfo(gamename, pagination, clientid, tag) {
request(
{
method: 'GET',
url: `https://api.twitch.tv/kraken/streams/?game=${gamename}&limit=100&offset=${pagination}`,
headers: {
'Client-ID': clientid,
'Accept': 'application / vnd.twitchtv.v5 + json'
}
},
(err, res, body) => {
if (!tag) {
tag = true;
if (err) {
return console.log('Error', err)
};
const data = JSON.parse(body);
const result = data.streams;
if (data.status === 404) {
console.log('fail to get data!');
};
for (let j = 0; j < result.length; j++) {
console.log(result[j].channel._id, result[j].channel.display_name);
};
tag = false;
}
}
)
}
for (let i = 0; i < 2; i++) {
getGameInfo(args, offset, clientID);
offset += 100;
}
【问题讨论】:
-
你可以使用promise。
-
@xMayank,是的,我注意到很多人使用 promise,这是一个很好的建议,但我喜欢在上面的代码中练习如何避免竞争条件。谢谢!
-
没有竞争条件。 Node js 异步处理 IO,不等待响应。查看 axios 库,并使用 async/await。这将大大改进代码。
标签: node.js api request race-condition