最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

无法获取路由文件以等待所有api调用完成

IT培训 admin 10浏览 0评论

无法获取路由文件以等待所有api调用完成

我尝试了标准的JS计时器,尝试了异步功能,尝试了使用计数器和if语句,但是对我来说没有任何作用;从技术上讲,这里完成了21个api调用,我需要我的程序才能工作。我的呼叫在控制台日志中工作,但它想在将movieData填满之前将数据发送回该页面。现在,它只是将一个空数组推入页面。

我到处都是这个网站,无济于事。

const router = require("express").Router()
const axios = require('axios')
require("dotenv").config()
// const controller = require("../controllers/userController")

function movieSearch(req, res) {
    const tmdbApiKey = process.env.tmdbApiKey
    let searchQuery = req.params.search
    
    const url = `;q=${searchQuery}`

    axios.get(url)
        .then(response => {
            let recommendations = response.data.Similar.Results

            console.log("Recommendations: ", recommendations)

            let movieData = []

            for (let i = 0; i < recommendations.length; i++) {
                const singleUrl = `=${tmdbApiKey}&language=en-US&page=1&query=${recommendations[i].Name}`
                axios.get(singleUrl)
                    .then(singleResponse => {
                        let single = singleResponse.data.results
                        
                        for (let x = 0; x < single.length; x++) {

                            if (single[x].title.toLowerCase() === recommendations[i].Name.toLowerCase()) {
                                console.log("Single[i]: ", single[x])
                                movieData.push(single[x])
                                break
                            }

                        }
                        
                    })
                    .catch(err => {
                        console.log(err)
                    })

            }

            res.send(movieData) // I still have to find someway to tell it to wait to send the data

        })
        .catch(err => {
            console.log(err)
        })
    
}

function showSearch(req, res) {
    let searchQuery = req.params.search
    
    const url = `;q=${searchQuery}`

    axios.get(url)
        .then(response => {
            let recommendations = response.data.Similar.Results
            res.send(recommendations)
        })
        .catch(err => {
            console.log(err)
        })
    
}

router.get("/api/movie/:search", movieSearch)

router.get("/api/tv/:search", showSearch)

module.exports = router
回答如下:

您需要Promise.all()

function movieSearch(req, res) {
//
//
let movieData = []
const promiseArr = []
           for (let i = 0; i < recommendations.length; i++) {
                const singleUrl = `https://api.themoviedb/3/search/movie?api_key=${tmdbApiKey}&language=en-US&page=1&query=${recommendations[i].Name}`

                promiseArr.push(axios.get(singleUrl))
}// for loop
Promise.all(promiseArr).then(result => {});// Array of result of each API request
// Do further operation here
}

Promise.all()问题,如果任何请求失败,处理将失败,并且没有结果。您可以尝试Promise.allSettled()

无法获取路由文件以等待所有api调用完成

我尝试了标准的JS计时器,尝试了异步功能,尝试了使用计数器和if语句,但是对我来说没有任何作用;从技术上讲,这里完成了21个api调用,我需要我的程序才能工作。我的呼叫在控制台日志中工作,但它想在将movieData填满之前将数据发送回该页面。现在,它只是将一个空数组推入页面。

我到处都是这个网站,无济于事。

const router = require("express").Router()
const axios = require('axios')
require("dotenv").config()
// const controller = require("../controllers/userController")

function movieSearch(req, res) {
    const tmdbApiKey = process.env.tmdbApiKey
    let searchQuery = req.params.search
    
    const url = `;q=${searchQuery}`

    axios.get(url)
        .then(response => {
            let recommendations = response.data.Similar.Results

            console.log("Recommendations: ", recommendations)

            let movieData = []

            for (let i = 0; i < recommendations.length; i++) {
                const singleUrl = `=${tmdbApiKey}&language=en-US&page=1&query=${recommendations[i].Name}`
                axios.get(singleUrl)
                    .then(singleResponse => {
                        let single = singleResponse.data.results
                        
                        for (let x = 0; x < single.length; x++) {

                            if (single[x].title.toLowerCase() === recommendations[i].Name.toLowerCase()) {
                                console.log("Single[i]: ", single[x])
                                movieData.push(single[x])
                                break
                            }

                        }
                        
                    })
                    .catch(err => {
                        console.log(err)
                    })

            }

            res.send(movieData) // I still have to find someway to tell it to wait to send the data

        })
        .catch(err => {
            console.log(err)
        })
    
}

function showSearch(req, res) {
    let searchQuery = req.params.search
    
    const url = `;q=${searchQuery}`

    axios.get(url)
        .then(response => {
            let recommendations = response.data.Similar.Results
            res.send(recommendations)
        })
        .catch(err => {
            console.log(err)
        })
    
}

router.get("/api/movie/:search", movieSearch)

router.get("/api/tv/:search", showSearch)

module.exports = router
回答如下:

您需要Promise.all()

function movieSearch(req, res) {
//
//
let movieData = []
const promiseArr = []
           for (let i = 0; i < recommendations.length; i++) {
                const singleUrl = `https://api.themoviedb/3/search/movie?api_key=${tmdbApiKey}&language=en-US&page=1&query=${recommendations[i].Name}`

                promiseArr.push(axios.get(singleUrl))
}// for loop
Promise.all(promiseArr).then(result => {});// Array of result of each API request
// Do further operation here
}

Promise.all()问题,如果任何请求失败,处理将失败,并且没有结果。您可以尝试Promise.allSettled()

发布评论

评论列表 (0)

  1. 暂无评论