我正在开发一个discord机器人(discord.js),该机器人可将统计数据从Rocket League Tracker网络中获取。我正在使用cheerio.js进行抓取,但在弄清楚如何实现使代码等待抓取完成的承诺时遇到了麻烦。
我的功能:
function UpdateStats(){
var JsonObj = GetJsonObject('users.json')
var users = GetUsers(JsonObj)
for (var i = 0; i < users.length; i++){
JsonObj = GetJsonObject('users.json')
users = GetUsers(JsonObj)
var platform = GetPlatform(i, JsonObj)
var id = GetID(i, JsonObj)
var tempModes = []
var tempRanks = []
for(let k = 1; k < 18; k+=2){
rp(URL+platform+'/'+id)
.then(function(html){
tempModes.push($('#season-' + currentSeason + ' .card-table.items', html)[1].children[3].children[k].children[2].children[0].data.trim())
tempRanks.push($('#season-' + currentSeason + ' .card-table.items', html)[1].children[3].children[k].children[2].children[1].children[0].data.trim())
})
.catch(function(err){
console.log(err)
})
}
tempModes.splice(0,1)
tempRanks.splice(0,1)
for(let j = 0; j < tempRanks.length; j++){
tempModes[j] = tempModes[j].replace('Ranked ', '')
tempModes[j] = tempModes[j].replace(' 1v1', '')
tempModes[j] = tempModes[j].replace(' 2v2', '')
tempModes[j] = tempModes[j].replace(' 3v3', '')
tempModes[j] = tempModes[j].replace('Duel', 'Solo Duel')
tempRanks[j] = tempRanks[j].slice(0, tempRanks[j].indexOf('\n'))
JsonObj = AddStat(tempModes[j], tempRanks[j], i, JsonObj)
}
WriteToJSON(JsonObj, 'users.json')
}
}
中间的“ for”是我想要等待的。照原样,此函数将立即跳转到tempModes.splice(0,1)
,而tempModes或tempRanks不包含任何内容。
我一直在尝试理解承诺的工作方式,并研究了this之类的各种帖子,但是对于我一生来说,我无法弄清楚如何处理.then()
中的承诺。在提出使用Promise.all()
的建议后,我尝试实现它(如下所示),但我认为我仍然对这里的概念有误解,因为我认为.then()
本身也可能抛出或者是一个承诺。许多帖子还建议使用setTimeout()
,但这对我来说是不可用的,因为我只是从网页中提取内容,而不是处理 网页中的事件。
function UpdateStats(){
var JsonObj = GetJsonObject('users.json')
var users = GetUsers(JsonObj)
for (var i = 0; i < users.length; i++){
JsonObj = GetJsonObject('users.json')
users = GetUsers(JsonObj)
platform = GetPlatform(i, JsonObj)
id = GetID(i, JsonObj)
var tempModes = []
var tempRanks = []
var promises = []
for (let k = 1; k < 18; k+=2){
promises.push(new Promise(function(){
rp(URL+platform+'/'+id)
.then(function(html){
tempModes.push($('#season-' + currentSeason + ' .card-table.items', html)[1].children[3].children[k].children[2].children[0].data.trim())
tempRanks.push($('#season-' + currentSeason + ' .card-table.items', html)[1].children[3].children[k].children[2].children[1].children[0].data.trim())
})
.catch(function(err){
console.log(err)
})
}))
}
Promise.all(promises).then(function () {
tempModes.splice(0,1)
tempRanks.splice(0,1)
for (let j = 0; j < tempRanks.length; j++){
tempModes[j] = tempModes[j].replace('Ranked ', '')
tempModes[j] = tempModes[j].replace(' 1v1', '')
tempModes[j] = tempModes[j].replace(' 2v2', '')
tempModes[j] = tempModes[j].replace(' 3v3', '')
tempModes[j] = tempModes[j].replace('Duel', 'Solo Duel')
tempRanks[j] = tempRanks[j].slice(0, tempRanks[j].indexOf('\n'))
JsonObj = AddStat(tempModes[j], tempRanks[j], i, JsonObj)
}
WriteToJSON(JsonObj, 'users.json')
})
}
}
在this page的大约一半处,显示了使用此特定库处理承诺的示例,但是我仍然不了解如何在我的特定用例中实现它。
有什么建议吗?