收藏
回答

怎么实现类似 let value = getStorageSync() 这样的同步方法?

试着用async/await封装了一下一些通用方法,方法是可以用了,但是抽出来作为通用方法,return一直不成功,拿不到return的值,貌似return是即时返回的。

有没有大佬知道怎么封装?

调用的风格就像这样

let value = getSthFunc(); // getSthFunc需要时间请求和处理

console.log(value);

看了这个文章:http://www.ruanyifeng.com/blog/2015/05/async.html

还是看不懂嗷

比如下面这是我封装的方法,我用let value = fetchCloud({name:'test'}); console.log(value);

打印出来的是一个promise方法,但是console.log("1", n)是可以打印出数值的

/**
 * 请求
 * @param {*} config 配置
 * @param {*} config.name 函数名称
 */
async function fetchCloud(config{
  let n = await new Promise((resolve) => {
    wx.cloud.callFunction({
      name: config.name
    }).then(res => {
      resolve(res)
    }).catch(err => {
      resolve(err)
    })
  })
  console.log("1", n) // 可以打印
  return n // 直接返回 promise 方法了
}
最后一次编辑于  06-08
回答关注问题邀请回答
收藏

5 个回答

  • 团团呗
    团团呗
    06-09
    function callFunction(config{
      return new Promise((resolve, reject) => {
        wx.cloud.callFunction({
          // 要调用的云函数名称
          name: config.name,
          successres => {
            // output: res.result === 3
            resolve(res)
          },
          failerr => {
            // handle error
            reject(err)
          },
          complete() => {
            // ...
          }
        })
      })
    使用的时候:
    let value = await callFunction({name:'test'}); console.log(value);
    


    06-09
    有用
    回复 3
    • Ethan
      Ethan
      06-09
      感谢回答。不过直接用await会报错,得在外边套async,比如这样。
      不知道有没有办法是能去掉async和await,直接
      let value = callFunction(),像getStorageSync一样阻塞后面的进程
      06-09
      回复
    • 团团呗
      团团呗
      06-09回复Ethan
      async函数是会返回一个Promise对象,调用的时候要加await,实力有限想不到别的办法了,建议你就这样用吧
      06-09
      回复
    • Ethan
      Ethan
      06-09回复团团呗
      好吧
      06-09
      回复
  • 王宗荣
    王宗荣
    06-09

    这个估计不行啊 返回值都是promise..你可以去看看node的sync api是怎么实现的,,

    06-09
    有用
    回复 1
    • Ethan
      Ethan
      06-09
      看了,依然无解
      06-09
      回复
  • xy
    xy
    06-08
    function callFunction(){
      return new Promise((resolve) => {
        wx.cloud.callFunction({
          name: config.name
        }).then(res => {
          resolve(res)
        }).catch(err => {
          resolve(err)
        })
      })
    }
    /**
     * 请求
     * @param {*} config 配置
     * @param {*} config.name 函数名称
     */
    async function fetchCloud(config{
      let n = await callFunction().then(res=>{console.log(res)return res})
      return n
    }
    


    06-08
    有用
    回复 3
    • Ethan
      Ethan
      06-08
      感谢回答,不过依然是返回了promise
      06-08
      回复
    • xy
      xy
      06-08回复Ethan
      06-08
      回复
    • Ethan
      Ethan
      06-09
      你图里这个{a:2}是fetchCloud()里面那个console.log打印出来的。但是现在想要的效果是let value = fetchCloud(),然后打印出value,如图,a:2能打印出来,但是value打印不出来
      06-09
      回复
  • Admin²⁰²⁰
    Admin²⁰²⁰
    06-08

    let value =await fetchCloud({name:'test'}); console.log(value);

    06-08
    有用
    回复 1
    • Ethan
      Ethan
      06-08
      直接这样会报错,不过改一下虽然也能用,但是想要去掉这个await,就跟let value = wx.getStorageSync()这个方法一样简洁。阮一峰里也有一个例子是这样写的,但是却只写了调用没写方法...
      06-08
      回复
  • 胖丫么胖
    胖丫么胖
    06-08

    比如呢,你想封装哪个方法。贴下代码。。

    06-08
    有用
    回复 1
    • Ethan
      Ethan
      06-08
      补上了:D
      06-08
      回复
登录 后发表内容
问题标签