多个顺序 fetch() Promise

IT技术 javascript angularjs json promise es6-promise
2021-01-13 07:23:24

我必须做出一系列fetch()Promise:我一次只有 1 个 url,这意味着只有 1 个fetch()Promise。每次我收到一个 json,这个包含另一个 json 的 url,所以我必须做出另一个fetch()Promise。

我可以处理多个Promise,但在这种情况下我不能这样做Promise.all(),因为我没有所有的 url,而只有一个。

这个例子不起作用,它都冻结了。

function fetchNextJson(json_url) 
{
    return fetch(json_url, {
            method: 'get'
        })
        .then(function(response) {
            return response.json();
        })
        .then(function(json) {
            console.log(json);
            return json;
        })
        .catch(function(err) {
            console.log('error: ' + error);
        });
}


function getItems(next_json_url) 
{
    if (!(next_json_url)) return;

    get_items = fetchNextJson(next_json_url);

    interval = $q.when(get_items).then(function(response) {
        console.log(response);
        next_json_url = response.Pagination.NextPage.Href;
    });

    getItems(next_json_url);
}


var next_json_url = 'http://localhost:3000/one';

getItems(next_json_url);
1个回答

您可以使用递归

function fetchNextJson(json_url) {
    return fetch(json_url, {
            method: 'get'
        })
        .then(function(response) {
            return response.json();
        })
        .then(function(json) {
            results.push(json);
            return json.Pagination.NextPage.Href 
                   ? fetchNextJson(json.Pagination.NextPage.Href)
                   : results
        })
        .catch(function(err) {
            console.log('error: ' + error);
        });
}


var next_json_url = 'http://localhost:3000/one';
var results = [];

fetchNextJson(json_url).then(function(res) {
  console.log(res)
})
哦,我同意。只是想开箱即用。
2021-03-15 07:23:24
没有考虑过这种情况。是的,如果发生错误,可以fetchNextJson()使用当前的 url调用.catch(),以尝试继续递归链;存储,限制次数。不过,同样,鉴于目前的要求,下一个 url 不会有来源。如果要求包括单独的 url 数组,则可以迭代整个数组,无论是错误被捕获、处理还是成功返回响应。一旦错误被处理了.catch(),就可以将promise返回给chained里面.then()不应该是错误的.then()可以继续递归调用函数
2021-03-22 07:23:24
使用计数器进行简化演示,而不是使用新 url 返回plnkr.co/edit/5boVimpYnoE1o41FXZGG?p=preview
2021-03-30 07:23:24
@charlietfl.catch()应该停止递归,除非fetchNextJson.catch(). 一种方法可能是处理错误,然后返回fetchNextJsonat .then()chained to.catch()或 in .catch()尽管目前的要求是fetchNextJson使用当前的结果调用 next fetchNextJson但似乎不会执行任何进一步的任务 - 除非从可选来源提供 url
2021-04-02 07:23:24
@charlietfl “结论是不断地将 then() 添加到链中,直到最终返回一个非Promise。” 任何从.then()chained to返回的结果fetchNextJson在第一次调用后都应该是 promise;.then()递归调用fetchNextJson或返回累积结果或其他值,作为Promise值
2021-04-11 07:23:24