uni-app UTS插件使用new Promise时,监听不到reject和finally的回调事件

uni-app UTS插件使用new Promise时,监听不到reject和finally的回调事件

类别 信息
产品分类 uniapp/App
PC开发环境 Windows
PC版本号 Windows 11 家庭中文版22621.3007
HBuilderX类型 Alpha
HBuilderX版本 3.99
手机系统 Android
手机版本号 Android 9.0
手机厂商 PDA
手机机型 DT40
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

操作步骤:

export const checkBluetoothIsConnected = () : Promise<ResponseResult> => {  
  return new Promise((resolve, reject) => {  
    const instance = new ResultCallback()  
    if (PrinterHelper.IsOpened()) {  
      resolve(instance.complete(200))  
    } else {  
      reject(instance.complete(9010001))  
    }  
  })  
}  
checkBluetoothIsConnected()  
    .then((response) => {  
      console.log(response)  
    })  
    .catch((res) => {  
      console.log(res)  
    })  
    .finally((e) => {  
      console.log(e)  
    })

预期结果:

  • catch里和finally里能监听到回调信息

实际结果:

  • catch和finally收不到回调信息,只能在resolve里收到

bug描述:

new Promise((resolve, reject) => {})的方式只能用resolve进去回调,如果失败的情况下用reject去回调,监听方会收不到,只能收到resolve的回调,控制台报错提示

Image


更多关于uni-app UTS插件使用new Promise时,监听不到reject和finally的回调事件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

我也是遇到这个问题,封装api返回Promise这种最好。但是预期达不到,失败不走catch和finally。所以只能设计成失败也走then或者传入回调的方式不走Promise。无奈啊,到处问都是无人应答。

更多关于uni-app UTS插件使用new Promise时,监听不到reject和finally的回调事件的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在使用 uni-appUTS 插件时,如果你发现 Promiserejectfinally 回调没有被触发,可能是由于以下几个原因:

1. Promise 的状态未被正确改变

  • 确保你在 Promiseexecutor 函数中正确调用了 reject 函数。如果 reject 没有被调用,reject 回调自然不会触发。
  • 例如:
    new Promise((resolve, reject) => {
        // 模拟异步操作
        setTimeout(() => {
            if (/* 某个条件 */) {
                resolve('Success');
            } else {
                reject('Error');
            }
        }, 1000);
    }).then(
        result => console.log(result),
        error => console.error(error) // 确保这里被调用
    ).finally(() => {
        console.log('Finally'); // 确保这里被调用
    });
    

2. UTS 插件本身的限制

  • UTS 插件可能在某些情况下对 Promise 的支持不完全,或者在某些环境下 Promise 的行为不一致。你可以检查 UTS 插件的文档或社区,看看是否有关于 Promise 的已知问题或限制。

3. 环境问题

  • 如果你在某些特定平台或环境下运行 uni-app(如小程序、H5、App 等),可能会出现不同平台对 Promise 的支持不一致的情况。确保你在目标平台上测试代码,并检查是否有平台相关的限制。

4. 代码逻辑错误

  • 检查你的代码逻辑,确保没有其他地方捕获了 Promise 的错误,导致 reject 回调没有被触发。例如,如果你在 then 中捕获了错误,reject 回调可能不会被调用。

5. 调试工具

  • 使用调试工具(如 console.logdebugger)逐步检查代码执行路径,确保 rejectfinally 的逻辑被正确执行。

6. Polyfill

  • 如果目标环境不支持 Promise 或支持不完全,可以考虑引入 Promisepolyfill,以确保 Promise 的行为一致。

7. UTS 插件的异步处理

  • UTS 插件可能对异步处理有特殊要求,确保你按照 UTS 插件的要求正确处理异步操作。

示例代码

以下是一个完整的示例,确保 rejectfinally 被正确触发:

new Promise((resolve, reject) => {
    // 模拟异步操作
    setTimeout(() => {
        const success = false; // 模拟失败
        if (success) {
            resolve('Success');
        } else {
            reject('Error');
        }
    }, 1000);
}).then(
    result => console.log(result),
    error => console.error(error) // 确保这里被调用
).finally(() => {
    console.log('Finally'); // 确保这里被调用
});
回到顶部