Функция возвращает undefined вместо результата запроса - PullRequest
0 голосов
/ 18 марта 2020

У меня есть некоторые проблемы с асинхронностью в javascript. Есть функция (следующая), которая многократно отправляет запросы REST API на сервер. Функции будут вызывать себя, пока не будет найден root ID. Вы можете найти console.log («ID root достигнут!») На месте. После этого мне нужен последний идентификатор запроса в качестве возвращаемого результата функции (next), но вместо этого он возвращает "undefined". ((

function next(initId) {
       return requestHttp('GET','https://www.wrike.com/api/v4/folders/' + initId)
        .then(function(response: string) {
            let folderObj =  JSON.parse(response);
            initId = folderObj.data[0].parentIds;
            if (folderObj.data[0].parentIds === WebHook.rootId) {
               console.log('the root ID is reached!');
               return folderObj.data[0].id;
            } else {
                next(initId); 
            }   
        }, function(error) {
            return error;
        });      
}

next(obj.data[0].parentIds).then(function(response) {
    console.log(response);
}).catch(function(err) {
    console.log(err);
});

Ответы [ 3 ]

1 голос
/ 18 марта 2020

Согласно API Wrike.com, вам не нужно делать это, чтобы найти идентификатор папки root. https://developers.wrike.com/documentation/api/methods/get-folder

[GET] /folders/{folderId} возвращает свойство parentIds, которое представляет собой массив идентификаторов родительских папок.

У меня нет учетной записи, но я Я вполне уверен, что первым или последним в этом массиве (в зависимости от порядка) является идентификатор папки ROOT, который вы не хотите найти.

Редактировать

Я не совсем уверен, что вы пытаетесь сделать, но тем временем есть несколько существенных ошибок, которые нужно исправить в вашем коде:

Во-первых, вот верный способ вернуть цепочечное обещание

function next(initId) {
    let promise = new Promise(function(resolve, reject) {
    requestHttp('GET','https://www.wrike.com/api/v4/folders/' + initId)
        .then(function(response) {
            if(/*condition to resolve promise*/) {
                resolve(/*with something*/);
            }
            else {
                reject(/*with an error*/);
                // or return another Promise
            }
        })
        .catch(error => reject(error));
    });
    return promise;            
}

Затем метод next принимает параметр с именем initId, поэтому другой разработчик (например, мы) не считает, что это массив идентификаторов.

Я имею в виду, это довольно запутанно , Это работает, потому что свойство parentIds является массивом и .toString() этого массива возвращает id1,id2,...

Wrike API поддерживает его, но вы должны использовать ids.join(',') вместо.

0 голосов
/ 19 марта 2020
function next(initId, taskId) {
    let promise = new Promise(function(resolve, reject) {
     (async function nextRequest (){   
     await requestHttp('GET','https://www.wrike.com/api/v4/folders/' + initId)
            .then(function(response: any) {
                let folderObj = JSON.parse(response);
                initId = folderObj.data[0].parentIds[0];
                if (initId == WebHook.rootId) {
                    resolve('resolve');
                }
                else {
                    nextRequest();
                }
            })
            .catch(error => reject(error));
        }());
    });
    return promise;            
}

next(obj.data[0].parentIds, true).then(function(response) {
    console.log(response);
}).catch(function(err) {
    console.log(err);
}); 

ответ на вопрос

0 голосов
/ 18 марта 2020

Попробуйте return Promise.resolve(initId) вместо next(initId).

...