0

我正在编写一个程序,它可以使用循环向外部 API 发送多个 get 请求(为每个 id 发送请求),但是当我运行代码时,我得到重复的 json 响应,例如在代码中我只有 3 个 id 所以服务器应该每个 id 发送一个请求,这意味着 3 个请求,但问题是服务器发送超过 3 个请求,即使循环应该在 3 个请求处停止,并且有时具有不同的顺序(不响应循环索引)请帮助我如此迷茫

    router.get('/activities/:stravaId',limiter,(req, res,done) => {

    const userc=req.user;
    const access_token=userc.access_token;

    var _=require("underscore");
    var fs=require("fs");
    const ids=[ 3822613688,3822608735,3822619781]
    strava = new stravaApi.client(access_token);
    for (const ind in ids) {
       strava.activities.listLaps({ id:ids[ind]},async function (err, payload) {
            if (!err) {
               console.log(payload)
               fs.appendFile("streamjson.json", JSON.stringify(payload), err => {
                    if (err) throw err;
                    console.log("Done writing"); // Success
                });
            } else {
                console.log(err)
            }
        })
    }
})
4

1 回答 1

0

我不确定是什么导致了您的问题,但我也许可以帮助您。

首先,我建议您将导入移动到模块的顶部。我认为您不想在每个新请求中加载“fs”和“下划线”。

现在关于订单。listMaps 的回调函数将在请求结束时执行,轮到 javascript 事件循环,这可能需要一些时间。

有关更多详细信息,我们建议您阅读


const _ = require('underscore')
const fs = require('fs')

router.get('/activities/:stravaId', limiter, async (req, res, done) => {
  const { user } = req.user
  const { access_token } = user
  const ids = [3822613688, 3822608735, 3822619781]

  strava = new stravaApi.client(access_token)

  try {
    const results = await Promise.all(
      ids.map((id) => doWhateverStravaDoes(id, strava))
      //.map((p) => p.catch((e) => e)) you can do this in case you also want to receive errors
    )
    // now you have the results in order as an array
    console.log({ results })

    try {
      results.forEach(({ payload }) => appendToFile('streamjson.json', payload))
      // just remember that you cannot use .forEach with asynchronous functions
    } catch (error) {
      console.log(error)
    }
  } catch (error) {
    console.log({ error })
  }
})

function appendToFile(file, payload) {
  fs.appendFile(file, JSON.stringify(payload), (err) => {
    if (err) throw err
    console.log('Done writing') // Success
  })
}

function doWhateverStravaDoes(id, strava) {
  return new Promise((resolve, reject) => {
    strava.activities.listLaps({ id }, (err, payload) => {
      if (err) {
        reject({ id, err })
      } else {
        resolve({ id, payload })
      }
    })
  })
}
于 2021-06-03T11:00:11.953 回答