Javascript-等待“ then”完成(使用cheerio.js)

时间:2019-03-02 05:11:32

标签: javascript node.js asynchronous discord.js

我正在开发一个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的大约一半处,显示了使用此特定库处理承诺的示例,但是我仍然不了解如何在我的特定用例中实现它。

有什么建议吗?

0 个答案:

没有答案