异步结果作为函数返回值

5,271 阅读1分钟
  • 把异步结果作为函数返回值。
    • 通常,一个函数如果要把异步结果(请求返回值、定时器结果等)作为这个函数的返回值,就需要回调函数。如果不用回调函数,在异步结束的时候直接return,那么调用这个函数的时候,函数的真正返回值会是undefined。例如函数a如下:
    this.$models.a('xxx').then(res=>{
            if(res.status.retcode === 0){
                return res.data
    }})
    
    • 调用函数a(),let result = a(),得到的值是undefined,因为请求是异步的,在获取到请求结果之前已经return了。

    • 传统方式就是给a传一个回调函数,在回调函数里处理其他业务逻辑,即

      • 调用:a(cb(....))
      • a的实现:
      this.$models.a('xxx', data).then(res=>{
          if(res.status.retcode === 0){
              if(cb) cb()
      }})
      
    • 有了Promise之后,可以新建一个Promise函数,得到一个返回值,

      • a:
      a() {
      // 其实$models返回的就是一个Promise,也可以直接return this.$models...,但是为了举例子方便,不再修改。
          return new Promise(resolve => {
              this.$models.a('xxx').then(res=>{
                  if(res.status.retcode === 0){
                      resolve(res.data)
                  } else {
                      resolve([])
                  }
              })
          })
      }
      
      • 调用:此时 a()是一个Promise对象,需要使用then()方法接收处理之后的值:
      a().then(data => {
          console.log(data) // 这个data就是resolve之后的数据
      })
      
    • 要实现类似的功能,还可以选择generator或者async,省去generator不谈,记录一下async的实现方法。

      • a:
      a() {
          return new Promise(resolve => {
              this.$models.a('xxx').then(res=>{
                  if(res.status.retcode === 0){
                      resolve(res.data)
                  } else {
                      resolve([])
                  }
              })
          })
      }
      
      • 调用:用一个async函数来接收a,然后调用这个函数即可
      async function b() {
          let data = await a();
          console.log(data)
          ....
      }
      b()