开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 12633|回复: 2
收起左侧

[交流] uniapp API Promise 化

[复制链接]

结帖率:100% (5/5)
发表于 2022-2-8 12:24:16 | 显示全部楼层 |阅读模式   河南省平顶山市
具体 API Promise 化 的策略:
  • 异步的方法,如果不传入 success、fail、complete 等 callback 参数,将以 Promise 返回数据。例如:uni.getImageInfo()
  • 异步的方法,且有返回对象,如果希望获取返回对象,必须至少传入一项 success、fail、complete 等 callback 参数。例如:

     // 正常使用
       const task = uni.connectSocket(
           success(res){
               console.log(res)
           }
       )

       // Promise 化
       uni.connectSocket().then(res => {
               // 此处即为正常使用时 success 回调的 res
               // uni.connectSocket() 正常使用时是会返回 task 对象的,如果想获取 task ,则不要使用 Promise 化
               console.log(res)
       })

不进行 Promise 化 的 API:
  • 同步的方法(即以 sync 结束)。例如:uni.getSystemInfoSync()
  • 以 create 开头的方法。例如:uni.createMapContext()
  • 以 manager 结束的方法。例如:uni.getBackgroundAudioManager()


Vue 2 和 Vue 3 的 API Promise 化
Vue 2 和 Vue 3 项目中 API Promise 化 返回格式不一致,以下为 不同点 和 返回格式互相转换
Vue 2
对部分 API 进行了 Promise 封装,返回数据的第一个参数是错误对象,第二个参数是返回数据。此时使用 catch 是拿不到报错信息的,因为内部对错误进行了拦截。

使用示例:
// 默认方式
uni.request({
    url: 'https://www.example.com/request',
    success: (res) => {
        console.log(res.data);
    },
    fail:(err) => {
        console.error(err)
    }
});

// Promise
uni.request({
        url: 'https://www.example.com/request'
    })
    .then(data => {
        // data为一个数组
        // 数组第一项为错误信息 即为 fail 回调
        // 第二项为返回数据
        var [err, res]  = data;
        console.log(res.data);
    })

// Await
async function request () {
    var [err, res] = await uni.request({
        url: 'https://www.example.com/request'
    });
    console.log(res.data);
}


Vue 3对部分 API 进行了 Promise 封装,调用成功会进入 then 方法 回调。调用失败会进入 catch 方法 回调
使用示例:

// 默认方式
uni.request({
    url: 'https://www.example.com/request',
    success: (res) => {
        console.log(res.data);
    },
    fail:(err) => {
        console.error(err)
    }
});

// 使用 Promise then/catch 方式调用
uni.request({
        url: 'https://www.example.com/request'
    })
    .then(res => {
        // 此处的 res 参数,与使用默认方式调用时 success 回调中的 res 参数一致
        console.log(res.data);
    })
    .catch(err => {
        // 此处的 err 参数,与使用默认方式调用时 fail 回调中的 err 参数一致
        console.error(err)
    })

// 使用 Await/Await 方式调用
async function request () {
    try{
        var res = await uni.request({
            url: 'https://www.example.com/request'
        });
        // 此处的 res 参数,与使用默认方式调用时 success 回调中的 res 参数一致
        console.log(res);
    } catch (err) {
        // 此处的 err 参数,与使用默认方式调用时 fail 回调中的 err 参数一致
        console.error(err)
    }
}



在 Vue 2 项目中, 使用 Vue 3 项目 API Promise 化 返回格式
// 在 main.js 中写入以下代码即可
function isPromise (obj) {
  return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function'
}

uni.addInterceptor({
  returnValue (res) {
    if (!isPromise(res)) {
      return res
    }
    return new Promise((resolve, reject) => {
      res.then(res => {
        if (res[0]) {
          reject(res[0])
        } else {
          resolve(res[1])
        }
      })
    })
  }
})
在 Vue 3 项目中, 使用 Vue 2 项目 API Promise 化 返回格式
// 在 main.js 中写入以下代码即可
function isPromise (obj) {
  return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function'
}

uni.addInterceptor({
    returnValue(res) {
        if (!isPromise(res)) {
            return res
        }
        const returnValue = [undefined, undefined]
        return res
            .then((res) => {
                returnValue[1] = res
            })
            .catch((err) => {
                returnValue[0] = err
            })
            .then(() => returnValue)
    }
})



签到天数: 15 天

发表于 2022-3-29 14:56:07 | 显示全部楼层   广东省广州市
66666666666666666666666
回复 支持 反对

使用道具 举报

发表于 2022-2-16 08:02:41 | 显示全部楼层   四川省德阳市
666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表