JS异步操作

news/2024/8/30 20:39:15 标签: javascript, uni-app

点击按钮触发onScan函数,函数调用扫描二维码这个异步操作后,需要扫描二维码的函数返回结果,可以用Promise来实现。Promise对象状态变为resolved(成功)或rejected(失败),然后将解决(或拒绝)的值作为表达式的结果返回。

javascript">scanQrCode: function()
{
	return new Promise((resolve, reject) => 
	{					
		uni.scanCode
		({
			onlyFromCamera: true,
			scanType: ['qrCode'],
			success: function (res) 
			{
				console.log('条码类型:' + res.scanType);
				console.log('条码内容:' + res.result);
				resolve(res.result)
			},
			fail: function()
			{
				reject('fail')
			}
		});
	});
},
onScan: function()
{
	this.scanQrCode().then((arrRtn) => 
	{
		console.log('arrRtn = ', arrRtn)
	})
	.catch(error => 
    {
		console.error('error = ', error);
		// 处理错误
	})
},

而如果点击按钮后,执行的onScan函数不能立即调用扫描二维码这个异步操作,而是弹出一个选择框(确定和取消),点击确定才能调用扫描二维码,相当于异步函数里调用异步函数。这时候可以用 async/await 结合Promise对象的方式。await是JavaScript中用于等待一个Promise对象执行完成并返回结果的关键字。当在一个使用async修饰的函数中使用await关键字时,它会暂停函数的执行,直到该Promise对象状态变为resolved(成功)或rejected(失败),然后将解决(或拒绝)的值作为表达式的结果返回。

javascript">scanQrCode: function()
{
	return new Promise((resolve, reject) => 
    {					
	    uni.scanCode
        ({
	        onlyFromCamera: true,
	        scanType: ['qrCode'],
	        success: function (res) 
	        {
	        	console.log('条码类型:' + res.scanType);
	        	console.log('条码内容:' + res.result);
	        	resolve(res.result)
	        },
	        fail: function()
	        {
	    	    reject('fail')
	        }
        });
    });
},

onScan: function ()
{
	let that = this
	uni.showModal
    ({
		title: '提示标题',
		content: '提示内容',
		showCancel: true,
		cancelText: '取消',
		confirmText: '确定',
		success: async (res) =>
		{
			if (res.confirm) 
			{
				console.log('用户点击确定按钮')
				const scanRes = await that.scanQrCode()
				console.log('scanRes = ', scanRes)
			} 
			else if (res.cancel) 
			{
				console.log('用户点击取消按钮')
			}
		}
	})
},

上面这种async/await的写法,也可以改用.then()来实现

javascript">scanQrCode: function()
{
	return new Promise((resolve, reject) => 
    {					
	    uni.scanCode
        ({
	        onlyFromCamera: true,
	        scanType: ['qrCode'],
	        success: function (res) 
	        {
	        	console.log('条码类型:' + res.scanType);
	        	console.log('条码内容:' + res.result);
	        	resolve(res.result)
	        },
	        fail: function()
	        {
	    	    reject('fail')
	        }
        });
    });
},

onScan: function ()
{
	let that = this
	uni.showModal
	({
		title: '提示标题',
		content: '提示内容',
		showCancel: true,
		cancelText: '取消',
		confirmText: '确定',
		success: (res) => 
		{
			if (res.confirm) 
			{
				that.scanQrCode().then(scanRes => 
				{
					console.log('用户点击确定按钮');
					console.log('scanRes = ', scanRes);				                
				}).catch(error => 
				{
					console.error('扫描错误:', error);
				});
			} 
			else if (res.cancel) 
			{
				console.log('用户点击取消按钮');
			}
		}
	});
},


http://www.niftyadmin.cn/n/5446051.html

相关文章

qt 实现 轮播图效果,且还有 手动 上一页和下一页 已解决

QT中有 轮播图的需求,按照正常html版本 。只需要配置数组就能搞定,但是c qt版本 应该用什么了。 第一想到的是采用定时器。 // 定时器初始化{m_pTime new QTimer(this);m_pTime->start(4 * 1000);//启动定时器并设置播放时间间隔m_pAutoFlag true;/…

【办公类-16-07-08】“2023下学期 大班户外游戏2(做成打印用的的贴墙版样式--A4横版撑满)”(python 排班表系列)

背景需求: 运用代码做出了中班每个班级用的户外游戏(新版)的表格(包含有场地的贴墙版和无场地的贴周计划版) 【办公类-16-07-07】“2023下学期 大班户外游戏2(有场地和无场地版,每天不同场地&…

python网络相册设计与实现flask-django-nodejs-php

此系统设计主要采用的是python语言来进行开发,采用django框架技术,框架分为三层,分别是控制层Controller,业务处理层Service,持久层dao,能够采用多层次管理开发,对于各个模块设计制作有一定的安…

学习笔记Day14:Linux下软件安装

软件安装 Anaconda 所有语言的包(package)、依赖(dependency)和环境(environment)管理器&#xff0c;类似应用商店 Conda < Miniconda < Anaconda&#xff08;有交互界面&#xff09; Linux下Miniconda即可 安装Miniconda 搜索北外/清华miniconda镜像网站&#xff…

【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698

漏洞描述 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 WordPress Plugin NotificationX 存在安全漏洞,该漏洞源于对用户提供的…

Linux下的parted磁盘分区工具

简介 Linux下的parted分区工具是一款功能强大的磁盘分区和分区大小调整工具&#xff0c;由GNU组织开发。它支持多种分区表格式&#xff0c;包括MS-DOS&#xff08;MBR&#xff09;和GPT&#xff0c;尤其适用于规则大小超过2TB的分区&#xff0c;但也可用于小分区的规划。GPT格…

Ubuntu中安装VSCode的一个指令

问题描述 本来想去VSCode官网上下载软件包&#xff0c;然后双击使用Ubuntu Software安装的&#xff0c;但是安装老不成功。 想用命令行指令dpkg进行安装&#xff0c;虽然能成功&#xff0c;但是后续使用 code . 命令打开VSCode又报错说找不到命令。 解决方式 在命令行中使用…

【设计模式】Java 设计模式之观察者模式(Observer)

观察者模式详解 一、概述 观察者模式&#xff0c;又被称为发布-订阅模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时&#xff0c;它的所有依赖者&#xff08;观察者&#xff09;都会收到通知并自…