Javascript 多次处理同一请求

Javascript 多次处理同一请求,javascript,request,fetch-api,Javascript,Request,Fetch Api,我正在制作一个用于学习的愚蠢的音乐问答游戏。我需要用来自的相关音乐填充我的视图 我需要的是: 获得一个随机类型 从该流派中获得5名艺术家(id+姓名) 从每位艺术家那里获得1首音乐(姓名+链接预览) 所以,直到第3步 但我不知道如何正确地发送相同的请求4次(每个艺术家),我的研究到目前为止没有给我任何结果 function deezer() { const reqGenero = new Request('https://api.deezer.com/genre'); fet

我正在制作一个用于学习的愚蠢的音乐问答游戏。我需要用来自的相关音乐填充我的视图

我需要的是:

  • 获得一个随机类型
  • 从该流派中获得5名艺术家(id+姓名)
  • 从每位艺术家那里获得1首音乐(姓名+链接预览)
  • 所以,直到第3步

    但我不知道如何正确地发送相同的请求4次(每个艺术家),我的研究到目前为止没有给我任何结果

    function deezer() {
    
        const reqGenero = new Request('https://api.deezer.com/genre');
    
        fetch(reqGenero)
            .then(response => {
                if (response.status === 200) {
                    return response.json();
                } else {
                    throw new Error('Erro ao pegar gêneros');
                }
            })
            .then(generos => {
                /* pega genero aleatorio */
                var generoId = generos.data[Math.floor(Math.random() * 10 + 1)].id;
                //console.log('\ngenero... ' + generoId);
                return fetch('https://api.deezer.com/genre/' + generoId + '/artists')
            })
            .then(response => {
                if (response.status === 200) {
                    return response.json();
                } else {
                    throw new Error('Erro ao pegar artistas');
                }
            })
            .then(artistas => {
                /* 1 música de 4 artistas */
                var artistasIds = [];
                for(var i = 0; i <= 4; i++) {   
                    artistasIds.push(artistas.data[i].id);
                    console.log('\nId: ' + artistasIds[i]);
    
                    // CAN I SEND THIS REQUEST 4 TIMES?
                    return fetch('https://api.deezer.com/artist/' + ids + '/top'); 
                }
            })         
            .catch(error => {
                console.error(error);
            });      
    }
    
    函数deezer(){
    const reqgrano=新请求('https://api.deezer.com/genre');
    取回(重新请求)
    。然后(响应=>{
    如果(response.status==200){
    返回response.json();
    }否则{
    抛出新错误('Erro ao pegar gêneros');
    }
    })
    .然后(慷慨=>{
    /*佩加·格兰托·阿莱托里奥*/
    var granoid=granos.data[Math.floor(Math.random()*10+1)].id;
    //console.log('\ngenero…'+id);
    返回获取('https://api.deezer.com/genre/“+ID+”/artists')
    })
    。然后(响应=>{
    如果(response.status==200){
    返回response.json();
    }否则{
    抛出新的错误('Erro ao pegar artistas');
    }
    })
    .然后(艺人=>{
    /*1名艺术家*/
    var artistasIds=[];
    对于(var i=0;i{
    控制台错误(error);
    });      
    }
    

    *如果我真的做错了什么,请告诉我。你可以创建4个请求,然后使用


    请注意
    catch()
    。这样可以确保即使一次提取失败,也不会忽略其他提取结果。这是因为其工作方式。因此,您需要迭代
    musicList
    ,并检查是否有形状为
    {error:/*error object*/}的对象
    并在处理列表时忽略它。

    您可以替换该语句

    // CAN I SEND THIS REQUEST 4 TIMES?
    return fetch('https://api.deezer.com/artist/' + ids + '/top'); 
    


    在这种情况下,您将从每个艺术家那里获得一个包含顶级音乐的值数组。我还没有检查给定的API,但理想情况下它应该可以工作。

    是的,您可以发出5个请求(不是4个,而是0-4个),然后等待每个请求完成。 用于创建请求承诺数组。(优先于-forEach和array.push)

    及 等待所有承诺完成,如果没有失败,将返回已解决响应的数组

    .then(artistas => {
      /* 1 música de 4 artistas */
      var artistasIds = [];
      let ids = artistas.data.map(artist => artist.id).slice(0, 4);
      requests = ids.map(id => fetch(`https://api.deezer.com/artist/${id}/top`));
      return Promise.all(requests);
      }
    }) 
    

    如果明确使用承诺(参见下面的
    async
    函数),我可能会这样做;请参见
    ***
    注释以了解解释:

    // *** Give yourself a helper function so you don't repeat this logic over and over
    function fetchJson(errmsg, ...args) {
        return fetch(...args)
            .then(response => {
                if (!response.ok) { // *** .ok is simpler than .status == 200
                    throw new Error(errmsg);
                }
                return response.json();
            });
    }
    function deezer() {
        // *** Not sure why you're using Request here?
        const reqGenero = new Request('https://api.deezer.com/genre');
        fetchJson('Erro ao pegar gêneros', reqGenero)
            .then(generos => {
                /* pega genero aleatorio */
                var generoId = generos.data[Math.floor(Math.random() * 10 + 1)].id;
                //console.log('\ngenero... ' + generoId);
                return fetchJson('Erro ao pegar artistas', 'https://api.deezer.com/genre/' + generoId + '/artists')
            })
            .then(artistas => {
                /* 1 música de 4 artistas */
                // *** Use Promise.all to wait for the four responses
                return Promise.all(artistas.data.slice(0, 4).map(
                    entry => fetchJson('Erro ao pegar música', 'https://api.deezer.com/artist/' + entry.id + '/top')
                ));
            })         
            .then(musica => {
                // *** Use musica here, it's an array of the music responses
            })
            .catch(error => {
                console.error(error);
            });      
    }
    
    假设您希望在
    deezer
    中使用结果。如果您希望
    deezer
    返回结果(四首歌曲的承诺),则:

    第二个函数的
    async
    函数版本:

    // *** Give yourself a helper function so you don't repeat this logic over and over
    async function fetchJson(errmsg, ...args) {
        const response = await fetch(...args)
        if (!response.ok) { // *** .ok is simpler than .status == 200
            throw new Error(errmsg);
        }
        return response.json();
    }
    async function deezer() {
        const reqGenero = new Request('https://api.deezer.com/genre');
        const generos = await fetchJson('Erro ao pegar gêneros', reqGenero);
        var generoId = generos.data[Math.floor(Math.random() * 10 + 1)].id;
        //console.log('\ngenero... ' + generoId);
        const artistas = await fetchJson('Erro ao pegar artistas', 'https://api.deezer.com/genre/' + generoId + '/artists');
        /* 1 música de 4 artistas */
        // *** Use Promise.all to wait for the four responses
        return Promise.all(artistas.data.slice(0, 4).map(
            entry => fetchJson('Erro ao pegar música', 'https://api.deezer.com/artist/' + entry.id + '/top')
        ));
    }
    

    typo
    return-fetch(…args)
    应该是
    return-fetch(args)
    @AZ\uz-不,不应该。如果您向
    fetchJson
    传递两个以上的参数,我们希望在调用
    fetch
    时分散rest参数。
    // *** Give yourself a helper function so you don't repeat this logic over and over
    function fetchJson(errmsg, ...args) {
        return fetch(...args)
            .then(response => {
                if (!response.ok) { // *** .ok is simpler than .status == 200
                    throw new Error(errmsg);
                }
                return response.json();
            });
    }
    function deezer() {
        // *** Not sure why you're using Request here?
        const reqGenero = new Request('https://api.deezer.com/genre');
        fetchJson('Erro ao pegar gêneros', reqGenero)
            .then(generos => {
                /* pega genero aleatorio */
                var generoId = generos.data[Math.floor(Math.random() * 10 + 1)].id;
                //console.log('\ngenero... ' + generoId);
                return fetchJson('Erro ao pegar artistas', 'https://api.deezer.com/genre/' + generoId + '/artists')
            })
            .then(artistas => {
                /* 1 música de 4 artistas */
                // *** Use Promise.all to wait for the four responses
                return Promise.all(artistas.data.slice(0, 4).map(
                    entry => fetchJson('Erro ao pegar música', 'https://api.deezer.com/artist/' + entry.id + '/top')
                ));
            })         
            .then(musica => {
                // *** Use musica here, it's an array of the music responses
            })
            .catch(error => {
                console.error(error);
            });      
    }
    
    // *** Give yourself a helper function so you don't repeat this logic over and over
    function fetchJson(errmsg, ...args) {
        return fetch(...args)
            .then(response => {
                if (!response.ok) { // *** .ok is simpler than .status == 200
                    throw new Error(errmsg);
                }
                return response.json();
            });
    }
    function deezer() {
        const reqGenero = new Request('https://api.deezer.com/genre');
        return fetchJson('Erro ao pegar gêneros', reqGenero) // *** Note the return
            .then(generos => {
                /* pega genero aleatorio */
                var generoId = generos.data[Math.floor(Math.random() * 10 + 1)].id;
                //console.log('\ngenero... ' + generoId);
                return fetchJson('Erro ao pegar artistas', 'https://api.deezer.com/genre/' + generoId + '/artists')
            })
            .then(artistas => {
                /* 1 música de 4 artistas */
                // *** Use Promise.all to wait for the four responses
                return Promise.all(artistas.data.slice(0, 4).map(
                    entry => fetchJson('Erro ao pegar música', 'https://api.deezer.com/artist/' + entry.id + '/top')
                ));
            });
            // *** No `then` using the results here, no `catch`; let the caller handle it
    }
    
    // *** Give yourself a helper function so you don't repeat this logic over and over
    async function fetchJson(errmsg, ...args) {
        const response = await fetch(...args)
        if (!response.ok) { // *** .ok is simpler than .status == 200
            throw new Error(errmsg);
        }
        return response.json();
    }
    async function deezer() {
        const reqGenero = new Request('https://api.deezer.com/genre');
        const generos = await fetchJson('Erro ao pegar gêneros', reqGenero);
        var generoId = generos.data[Math.floor(Math.random() * 10 + 1)].id;
        //console.log('\ngenero... ' + generoId);
        const artistas = await fetchJson('Erro ao pegar artistas', 'https://api.deezer.com/genre/' + generoId + '/artists');
        /* 1 música de 4 artistas */
        // *** Use Promise.all to wait for the four responses
        return Promise.all(artistas.data.slice(0, 4).map(
            entry => fetchJson('Erro ao pegar música', 'https://api.deezer.com/artist/' + entry.id + '/top')
        ));
    }