收藏
回答

如何等待异步函数返回后在执行赋值操作?

async getData(i){
  //这个函数是异步的从服务器获取data
  //怎么获取略
  //最后return data
    return data;
}

onLoad:function(){
  for(int i=1;i<data.length;i++){
    this.setData({
      abc[i]:getData(i);
    }) 
  }
}
但是setData执行完了,getData才return,怎么等getData执行完了,我在setData
拒绝使用callback和把操作写到getdata里,因为我就是要for循环。
最后一次编辑于  2020-03-31
回答关注问题邀请回答
收藏

2 个回答

  • Zzz
    Zzz
    2020-03-31

    楼主可能需要加强一下 es6 的基础知识:

    • 假设你原来有一个使用 callback 的异步函数:
    function getData(index, callback) {
      setTimeout(function () {
        callback(null, `${index} is done`);
      }, 1000)
    }
    
    • 现在你想借用 es6 的 async 语法糖干掉一大堆难看的 callback,那么可以手动把它用 Promise 包装一下:
    function asyncGetData(index) {
      return new Promise(function (resolve, reject) {
        getData(index, function (err, res) {
          if (err) {
            reject(err);
            return;
          }
          resolve(res);
        });
      });
    }
    
    • 对于小程序来说,如果你的代码输出时有用 babel 转换器处理或者开启了开发工具的 es6转es5 、增强编译等功能,那么调用时就可以用 async / await:
    async function loadData() {
      // 一般来说,循环中使用 await 是不提倡的,部分 babel 转换器在特殊情况下会产生 bug
      for (let i = 0; i < 5; i++){
        try {
          const data = await asyncGetData(i); // 请注意 await 几个字不能少,否则 data 将是一个 Promise
          console.log(`data ${i} = ${data}`);
          setData({ dataKey: data });
        } catch (err) {
          console.log(`err = ${err}`);
        }
      }
    }
    
    • 请知悉:内部直接使用了 `await` 的函数必须被声明为 `async` 函数
    2020-03-31
    有用
    回复 3
    • cc
      cc
      2020-04-01
      谢谢大佬,但小白有个疑问,你代码里的$是啥,是jq的东西吗
      2020-04-01
      回复
    • Zzz
      Zzz
      2020-04-01回复cc
      这是 javascrip 的字符串模版标识符。详细的你可以搜一下,大致使用方式为:
        - 将字符串用 `` 号包裹;
        - 在其中可将变量、表达式、函数表达式等用 ${ } 包裹;
        - 其效果为:执行 ${ } 内的表达式,将其返回值作为字符串合并至整个字符串。
        - 例:
      2020-04-01
      回复
    • cc
      cc
      2020-04-01回复Zzz
      谢谢大佬耐心解答
      2020-04-01
      回复
  • 老张
    老张
    2020-03-31

    https://developers.weixin.qq.com/community/develop/article/doc/00028cbc2e04e0ddf549d535351c13

    2020-03-31
    有用
    回复 1
    • cc
      cc
      2020-04-01
      谢谢
      2020-04-01
      回复
登录 后发表内容
问题标签