如何返回递归提取的结果?

时间:2019-05-30 08:34:20

标签: asynchronous recursion fetch

我有第一个异步功能

fetch("https://api.priceapi.com/v2/jobs", {
            body: body,
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            method: "POST"
                }).then((response) => {
                            return response.json();
                        }).then((data) => {

                            return fetchRepeat(data.job_id)
                        })

第二个递归异步函数。

function fetchRepeat(id){

    fetch("https://api.priceapi.com/v2/jobs/"+ id +"/download.json?token=" + priceapisecret.secret)
    .then((response) => {
        return response.json()
    }).then((data) =>{
        if(data.status == "finished"){

            var bookdata = {
                title: data.results[0].content.name,
                price: data.results[0].content.price
            }

            return bookdata;

        }
        else{
            fetchRepeat(id)
        }
    })
}

我希望能够在第一个异步功能中访问bookdata。我该怎么办?

1 个答案:

答案 0 :(得分:1)

要谈论退货,您的fetchRepeat需要退回承诺。结果并非如此,返回undefined。最后一个then也不返回递归的值,因此也解析为undefined

这是一个有效的版本:

function fetchRepeat(id) {
    // return the promise
    return fetch(`https://api.priceapi.com/v2/jobs/${id}/download.json?token=${priceapisecret.secret}`)
        .then(response => response.json())
        .then(({ status, results: [{ content: { name: title, price } }] = [{ content: {} }] }) =>
            (status === 'finished' ? { title, price } : fetchRepeat(id))); // return result of recursion
}

现在,我让ESLint处理格式,并且由于我使用airbnb,因此它更喜欢进行结构分解。最后一个then中的错误很明显,因为ELSint抱怨一致的回报。我敦促您使用linter和IDE来强制执行编码样式,以减少代码中的错误并使其他人更容易阅读。