当涉及循环时,是否可以将任何异步等待函数转换为老式的 .then().catch()
Is it possible to translate ANY async-await function to old school .then().catch() when loop is involved
我正在尝试将我的 async-await 函数转换为旧式 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
代码。
对于您的情况,您需要创建一个“异步循环”:创建一个获得第一个承诺的函数,然后作为 then
回调操作,(稍后)再次调用该新函数,所以链接承诺直到知道最终结果,此时所有这些承诺都解决了。
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)
});
}
我正在尝试将我的 async-await 函数转换为旧式 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
代码。
对于您的情况,您需要创建一个“异步循环”:创建一个获得第一个承诺的函数,然后作为 then
回调操作,(稍后)再次调用该新函数,所以链接承诺直到知道最终结果,此时所有这些承诺都解决了。
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)
});
}