函数返回未定义而不是请求的结果

Posted

技术标签:

【中文标题】函数返回未定义而不是请求的结果【英文标题】:Function returns undefined instead of result of the request 【发布时间】:2020-06-29 19:38:01 【问题描述】:

我对 javascript 中的异步有一些问题。有一个函数(next) 重复向服务器发送 REST API 请求。这些函数将调用自身,直到找到根 ID。您可以在现场找到console.log('到达根ID!')。之后,我需要最后一个请求 ID 作为函数的返回结果(下一个),但它返回“未定义”。((

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);
);

【问题讨论】:

第 8、10 和 13 行必须返回已解决或被拒绝的 Promise 才能在 next() 方法上使用 .then() 【参考方案1】:
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);
); 

问题的答案

【讨论】:

【参考方案2】:

根据 Wrike.com api,您不必这样做来查找根文件夹 ID。 https://developers.wrike.com/documentation/api/methods/get-folder

[GET] /folders/folderId 返回一个 parentIds 属性,它是父文件夹 ID 的数组。

我没有帐户,但我很确定此数组中的第一个或最后一个(取决于顺序)是您不想找到的 ROOT 文件夹 ID。

编辑

我不太确定您要做什么,但与此同时,您的代码中有几个基本错误需要修复:

首先,这是返回链式承诺的正确方法

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 的参数,因此其他开发人员(如我们)不会认为它是一个 id 数组。

我的意思是,这很令人困惑。它之所以有效是因为parentIds 属性是一个数组,而该数组的.toString() 返回id1,id2,...

Wrike api 支持它,但你应该改用ids.join(',')

【讨论】:

对不起,这不是 ROOT 或 Wrike.com api 的问题。我只是想找到获得我需要的价值的方法 查看我对您的回答的评论。您不返回 Promise 而是返回值,这就是它不起作用的原因。 查看我的更新答案以了解如何返回链式承诺 谢谢,感谢您的帮助。你给我一个提示。我的主要任务是找到一组自定义字段并为子元素继承它们。为此,我需要遍历父对象。 顺便说一句,您对 parentIds 的看法是正确的。它是一个数组【参考方案3】:

试试return Promise.resolve(initId) 而不是next(initId)

【讨论】:

在这种情况下,函数返回初始ID而不是最后一个 抱歉,是的,您应该返回 Promise.resolve(folderObj.data[0].id) 而不是 return folderObj.data[0].id;。但是如果你总是引用数组中的元素 0,你如何遍历 id? initId = folderObj.data[0].parentIds - 以下代码行在每次迭代时向上移动到下一个 ID 问题是函数初始化后返回结果

以上是关于函数返回未定义而不是请求的结果的主要内容,如果未能解决你的问题,请参考以下文章

返回未定义而不是数字的函数[重复]

未找到结果时如何从 Mongoose Find 查询返回自定义消息而不是空数组

在返回承诺的函数上使用 .success 时,未定义不是函数

Parse.Cloud.httpRequest 使用 POST 方法返回“未定义”而不是响应

嵌套函数中的未定义变量

Promise mysql返回未定义,如何让函数等待结果