如何给递归方法加一个异步机制,使得能够在外层等待该递归方法执行完成后再执行后续流程?

如题,假设在methods中有一个init初始化方法和一个loopfun(自定义的递归方法),初始化方法里面需要调用loopfun这个方法去清洗数据,但是现在遇到的情况是在init方法内,当我var data = this.loopfun(arr,key)这样申明一个data对象去接收递归方法的返回值的时候,返回的是undefined,如下:

init(){
  var data = this.loopfun(arr,key)
  console.log(data)//undefined
},
loopfun(arr,key){
 for(var i=0,i<arr.length;i++){
   if(arr[i].id==key){
    return {i:i,name:arr[i].name}
   } else {
    if(arr[i].child.length>0){
      this.loopfun(arr[i].child,key)
    }
   }
 }
}

直接延时执行又不太好把握这个时机(最好是当loopfun方法return之后就马上执行后续步骤),所以我想利用Promise这种方式来实现这个需求,改写如下:

init(){
  this.loopfun(key,arr).then(val => {
    console.log(val);
  })
},
loopfun(arr,key){
 for(var i=0,i<arr.length;i++){
   if(arr[i].id==key){
    return Promise.resolve({i:i,name:arr[i].name})
   } else {
    if(arr[i].child.length>0){
      this.loopfun(arr[i].child,key)
    }
   }
 }
}

发现控制台报错Cannot read property 'then' of undefined",应该是这种写法不正确。请问改如何按照Promise的方式实现这个清洗数据的递归方法?

阅读 2.2k
2 个回答
loopfun(arr,key){
 for(var i,i<arr.length;i++){
   if(arr[i].id==key){
    return {i:i,name:arr[i].name}
   } else {
    if(arr[i].child.length>0){
      const temp = this.loopfun(arr[i].child,key)
      if (temp) return temp
    }
   }
 }

你的 i 都没有给初始值
for(var i,i<arr.length;i++){
i<arr.length 直接是个false 就没有执行for里面的内容,所以返回就是个 undefined 了

改成
for(var i = 0;i<arr.length;i++){ 试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题