当涉及循环时,是否可以将ANY异步等待函数转换为老派.then().catch()



我正在尝试将异步等待函数转换为老式的Promises方式。

主要的挑战是,我需要循环一个函数,并使用响应来获取更多。

这是我的功能:

async function getHierarchyForId(id) {
try {
let result = '';
let member = await fetchMemberById(id)
let tmp = member.parentMemberId
console.log(member)
for(let i = member.level; i > 1; i--){
let parent = await fetchMemberById(tmp)
console.log(parent)
if(i == 2){
result += `${parent.name}`
}else{
result += `${parent.name} -> `
}
tmp = parent.parentMemberId
}
console.log(result)
return result
}catch(e){
console.log(e)
}
}

这是正确的工作,我试图将其转换为promise函数。

这是我得到的,但有些代码写错了。

async function getHierarchyForId(id) {
fetchMemberById(id)
.then(member => {
let result = '';
let tmp = member.parentMemberId
for (let i = member.level; i > 1; i--) {
let parent = fetchMemberById(tmp)
.then(r => {
console.log(r)
if (i == 2) {
result += `${r.name}`
} else {
result += `${r.name} -> `
}
tmp = parent.parentMemberId
})
.catch(err => console.log(err))
}
console.log(result)
return result
})
.catch(e => console.log(e))
}

感谢您抽出时间!

是的,任何async/await代码都可以转换为then/catch代码。

对于您的案例,您需要制作一个";"异步循环":创建一个获得第一个promise的函数,然后作为then回调操作,(稍后(再次调用该新函数,因此链接promise直到知道最终结果,此时所有这些promise都会解析。

function getHierarchyForId(id) {
return fetchMemberById(id).then(member => {
console.log(member);
return (function loop(id, i, arr) {
if (i <= 1) return arr.join(" -> "); // loop done
return fetchMemberById(id).then(parent => {
console.log(parent);
return loop(parent.parentMemberId, i-1, arr.concat(parent.name));
});
})(member.parentMemberId, member.level, []); // Start of the loop
}).catch(e => {
console.log(e)
});
}

最新更新