当涉及循环时,是否可以将任何异步等待函数转换为老式的 .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)
   });
}