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的回调,控制台报错提示
更多关于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-app
的 UTS
插件时,如果你发现 Promise
的 reject
和 finally
回调没有被触发,可能是由于以下几个原因:
1. Promise 的状态未被正确改变
- 确保你在
Promise
的executor
函数中正确调用了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.log
或debugger
)逐步检查代码执行路径,确保reject
和finally
的逻辑被正确执行。
6. Polyfill
- 如果目标环境不支持
Promise
或支持不完全,可以考虑引入Promise
的polyfill
,以确保Promise
的行为一致。
7. UTS 插件的异步处理
UTS
插件可能对异步处理有特殊要求,确保你按照UTS
插件的要求正确处理异步操作。
示例代码
以下是一个完整的示例,确保 reject
和 finally
被正确触发:
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'); // 确保这里被调用
});