如何使递归函数在诺言下正常工作

时间:2019-04-27 09:41:03

标签: javascript recursion promise

我有一个返回承诺的递归函数,然后我根据该承诺的结果执行一些操作。问题在于它只返回递归函数的一个迭代,这对我来说没有意义。

我试图通过使用setTimeout调用来使其正常工作,这是可行的,但不是很好的做法。我还曾尝试过在承诺之后拼命地添加另一个,看看是否有帮助。

我要获取正确值的变量是“ SurveyArray”。 “ Survey”变量给出三个数组的正确结果。 SurveyArray应该是将这些数组合并为一个包含245个元素的数组,但是它提出了100个元素,这仅是一个元素数组。在我的代码中,我已经将“ Survey”和“ SurveyArray”都记录到了控制台。您可以在以下代码笔中看到此操作:https://codepen.io/anon/pen/JVxmKP

var apiToken = "h69TKYgxu46SMEXzcKkeRUXovq2jALTpHDhPUGLq"
var dataCenter = "co1"

var baseUrl = "https://cors-anywhere.herokuapp.com/https://" + 
dataCenter + ".qualtrics.com/API/v3/surveys"


function getSurveys(url) {
// Default options are marked with *
    return fetch(url, {
        method: "GET", // *GET, POST, PUT, DELETE, etc.
        mode: "cors",
        // include, *same-origin, omit
        headers: {
            "Content-Type": "application/json",
            "x-api-token": apiToken,
            "accept": "application/json"
        }
    })
    .then(response => response.json()); // parses response to JSON
}

var Surveys = []
var offset = 0;
var page = 0
var SurveyArray = []

GroupSurveys(baseUrl).then(function(){

    console.log(Surveys)
    Object.keys(Surveys).forEach(function(surveys) {

Object.keys(Surveys[surveys]. 
result.elements).forEach(function(survey) {


SurveyArray.push(Surveys[surveys].result.elements[survey].name)
    })

     console.log(SurveyArray)

})





})

function GroupSurveys(url) {
    return getSurveys(url)
        .then(data => Surveys.push(data))
        .then(function() {
            if (Surveys[page].result.nextPage) {
                offset += 100
                page += 1
                GroupSurveys(baseUrl + "?offset=" + offset)
            }

    })
    .catch(error => console.error(error)); // JSON-string from 
`response.json()` call
}

我希望SurveyArray具有245个元素,第一个数组包含100个元素,第二个数组包含100个元素,最后一个数组包含45个元素。它仅提供100个元素,仅是一个数组的数据。

1 个答案:

答案 0 :(得分:0)

您需要包装Promise的GroupSurveys来跟踪所有已完成的请求:

function GroupSurveys(url) {
    return new Promise(res => {
        function GroupSurveysRecursive(url) {
            getSurveys(url)
                .then(data => Surveys.push(data))
                .then(function () {
                    if (Surveys[page].result.nextPage) {
                        offset += 100;
                        page += 1;
                        GroupSurveysRecursive(baseUrl + '?offset=' + offset)
                    } else {
                        res();
                    }
                })
                .catch(error => console.error(error)); // JSON-string from `response.json()` call
        };
        GroupSurveysRecursive(url);
    })
}