Javascript 如何使用API调用等待for循环的最终结果?

Javascript 如何使用API调用等待for循环的最终结果?,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,这个循环将运行任意次数,我希望在所有这些之后得到结果。我尝试的任何东西(Promisify、async/Wait、嵌套函数等)似乎都是死胡同。我不明白为什么我不能在API调用或我在这里创建的函数上使用。但我怀疑,就我的理解而言,这个问题更为根本,因为我甚至无法获得返回的“数据”…同样无法等待API调用。将其包装在承诺中会丢失“数据”,而在其中使用“for循环”提取它也不起作用。这让我质疑我在JS/实现他人API方面的整个进展 const gotPeeps = () => {

这个循环将运行任意次数,我希望在所有这些之后得到结果。我尝试的任何东西(Promisify、async/Wait、嵌套函数等)似乎都是死胡同。我不明白为什么我不能在API调用或我在这里创建的函数上使用。但我怀疑,就我的理解而言,这个问题更为根本,因为我甚至无法获得返回的“数据”…同样无法等待API调用。将其包装在承诺中会丢失“数据”,而在其中使用“for循环”提取它也不起作用。这让我质疑我在JS/实现他人API方面的整个进展

  const gotPeeps = () => {
      challongeClient.tournaments.show({
      id: tournamentURL,
      callback: (err, data) => {
         //return data //doesnt return "data" from gotPeeps?
        for (const [key, value] of Object.entries(data.tournament.matches)) {
            if (value.match.state === 'open') {
              peepsList.push(value.match.player1Id, value.match.player2Id)
              console.log(peepsList)
    }}}})}
    gotPeeps()
编辑 对评论意见: 我试图在for循环完成后得到结果。 我所指的“循环”是数据对象上的“for of”。 “将代码放在循环之后,但放在回调内部”不起作用。这周我有一个问题没能解决: 以下是全部内容,一些过去的版本被注释掉了:

const tournamentModel = require('../models/tournamentSchema')
require('dotenv').config()
const challonge = require('challonge');

module.exports = {
  name: 'getmatches',
  aliases: ['gm'],
  cooldown: 0,
  description: 'Get Challonge data into console.',
 
  execute(message, args, cmd, client, Discord, profileData) {
    let peep = ''
    let peepsList = ''
    const tournamentURL = 'TESTING_Just_Sign_Up_If_You_See_This850587786533011496'
    const challongeClient = challonge.createClient({
      apiKey: process.env.CHALLONGE_API_KEY,
    })
  
  const getPlayer = (playerXId) => {
    return new Promise((resolve, reject) => {
      challongeClient.participants.show({
        id: tournamentURL,
        participantId: playerXId,
        callback: (err, data) => {
          if (err) {
            reject(err);
            return;
          }        
          peep = data.participant.misc
          peepsList.push(peep)
          console.log(peepsList)
          console.log('RUNNING GET PLAYER', playerXId, playerIndexCount)
          resolve(peepsList);  
          }
        });
      });
    }
    
    

    const peepsList = []
    const matchList = []
    const gotPeeps = () => {
      challongeClient.tournaments.show({
      id: tournamentURL,
      include_participants: 1,
      include_matches: 1,
      callback: (err, data) => {
        for (const [key, value] of Object.entries(data.tournament.matches)) {
            if (value.match.state === 'open') {
              peepsList.push(value.match.player1Id, value.match.player2Id)
              console.log(peepsList)
            }
          }
      }
        
              /*// GET PLAYERS
            getPlayer(value.match.player1Id)
            .then(() => {
            getPlayer(value.match.player2Id)
          }) 
        }
          */
                    
                  }
            )         
      }
      
    gotPeeps()
    }}

您可以让此函数返回承诺并等待函数(只要您的函数是
async
函数)

const gotPeeps=()=>{
返回新承诺((解决、拒绝)=>{
const peepsList=[];//声明要填充的空数组
challongeClient.Tournames.show({
id:tournamentURL,
回调:(错误,数据)=>{
for(Object.entries(data.contraction.matches)的常量[键,值]){
如果(value.match.state==“打开”){
peepsList.push(value.match.player1Id,value.match.player2Id);
}
}
resolve(peepsList);//使用填充数组解析承诺
//TODO:处理拒绝
},
});
})
};
(异步()=>{
试一试{
const result=await gotPeeps();
}捕获(错误){
//TODO:句柄错误
}
})();

我不知道你想做什么
gotPeeps
是一个递归函数,但我不知道它在哪里结束,并且
challongeClient.tournaments.show
有一个回调,您希望在再次调用
gotPeeps
之前等待它?在似乎是无限循环的情况下?我看到最后的
}
使它看起来像
gotPeeps
调用在函数内部,但它不是。也许值得删除那些尾随的
}
,因为它们现在不属于任何东西。你说的是哪个循环?如果您指的是
Object.entries
的迭代,只需将代码放在循环之后,但仍在回调中。请向我们展示您如何尝试提示代码,以及您希望返回的内容。另外,
peepsList
声明在哪里?下面的回答尝试正是我尝试的方式,Bergi,我所说的“循环后编码,但在回调中”也不起作用,它只是跳出并愉快地“解决”未定义的承诺,哪一个不可能?+1对于TODO:-)添加
err
的处理应该很容易添加,但我也可以添加一个try catch来展示如何处理错误我喜欢TODO!然而,这正是我无法解决的问题!您的版本是我已经尝试过的版本,我认为任何尝试提示此API调用的行为都会导致在调用返回之前“解决”它!以下是错误:Object.entries(data.tourbance.matches)){TypeError:无法在Function.entries()中将未定义或null转换为对象在callbackWell,该错误消息意味着您返回的数据在
data.contraction.matches
中没有条目。我不知道您的数据的形状,因此我无法帮助您。愤怒的评论对您没有帮助。我正试图帮助您,但这里没有足够的信息来做这件事。console.log
data
你的for循环并将结果发布在你的问题中。