函数返回未定义而不是请求的结果
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 时,未定义不是函数