小程序中的callback使用,及面临的风险

2023-11-20

1.前言

在项目开发中,初步逻辑是:

  1. 获取用户的openid----》
    2.使用openid去查询用户数据表中是否有这个用户---》
    3.如果没有这个openid的用户(非key字段),新建一条用户数据;
    但在实际的操作者,发现数据库会存在如下图的情况:

    数据库中openid未写入

2.why

查阅资料发现是,因为网络的原因,前面的openid获取还未完成,后面的写入函数已经开始执行了。

3.how

在看到一个比较不错的源码时,发现作者写了很多的callback。如图

借鉴的代码中出现许多success()

查阅发现这些就是传说的 回调函数,犹记得上次接触这个词语还是在OSG和vtk的的代码时遇到过。

4.知其然,后知其所以然

参考网上的一个理解,写如下的内容,供给那些有时间研究的的去看:

情况1:
普通任务流程为:A->B
写法为:
main:function(){
    A();
    B();
}
情况2 :
异步方法A和B(re:wx.request);
写法:
main:function(){
    A();
};
A:function(){
    wx.request({
        url:URL,
        success:function(){
            B();
        }
    });
}
情况3:
异步方法(ABC)运行流程为:A->B且A->C
写法:
main: function(){
    A(B);
    A(C);
};
A:function(callback){
    wx.request({
        url:URL,
        success:res=>{  
        if(callback){
            callback();
        }
    })
}
//本质上是,A函数只是个框架函数,到底A运行完了以后需要干什么事,A并不关注具体的内容。
//类似于A干的就是“去食堂吃饭”;A中的回到函数类似于“帮别人待吃的”,具体"给谁带、给谁带",由传入的参数(函数决定)
//与普通的函数传入参数不同,其传入的是一个事情(一个方法--function);

情况4:A函数自己有参数,而且有回调的情况,此时A运行完成,会出现两种情况,成功或者失败
写法:
//A 方法需要有参数 name,成功和失败两个回调函数,把结果 (成功和失败均有)res 给到回调函数。
A:function(name, successCallback, failCallback){
    wx.request({
        url: URL,
        success:function(res){
            if(successCallback){
                successCallback(res);
            }
        },
        fail:function(res){
            if(failCallback){
                failCallback(res);
            }
        }
    });
} ,
//A有入参,自己执行受制于入参,同时,A完成后,需要再干的事情,是一个复杂的事情,而不是一个变量
//A吃饭什么这个事情,自己需要有外部决定(饭卡里面的钱数),要帮别人带饭,帮谁带,带什么饭,由A自己吃饭的结果视情况而定。
//A将自己业务完成后后的一个参数会传给B和C
B:function(res){
    console.log('成功' + res);
}
C:function(res){
    console.log('失败' + res);
}
//调用方法为
main:function(){
    var name = '';
    A(name, B, C);
}
//稳定版本的写法是:
main: function(){
    var name = '';
    var successCallback = function(res){
        B(res);
    }
    var failCallback = function(res){
        C(res);
    }
    A(name, successCallback, failCallback);

}

参考链接:https://www.jianshu.com/p/a70785dbbc8b

5.总结

整个逻辑整理明白了,写帖子以记录,并在这个过程对自己的思路由进一步做了思考。技术的成长特殊性就在于,需要这个积累,其是线性的,不大具备突变和跳跃,需要的是稳扎稳打一步一个脚印。

6.道

法布施得智慧吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小程序中的callback使用,及面临的风险 的相关文章

随机推荐

  • 使用OpenCV与深度学习从视频和图像中精准识别人脸: Python实践指南

    第一部分 引言与背景 人脸识别已经成为了当代技术领域中最热门和广泛应用的话题之一 从智能手机的解锁功能到机场的安全检查 人脸识别技术无处不在 在这篇文章中 我们将使用Python中的OpenCV库和深度学习模型 深入探讨如何从视频和图像中精
  • js 对数组对象进行排序

    let listData id 1 name 测试1 presenttime 1557883600000 id 2 name 测试2 presenttime 1580751813000 id 3 presenttime 1561448381
  • svn版本号,命令中-r 2和@2的区别

    问题 假设有一个svn repository是 svn 192 168 2 6 project 在版本1 20的svn里 存在 svn 192 168 2 6 project branches branch test 在版本21时 由于br
  • BUUCTF-Web-命令执行-[ACTF2020 新生赛]Exec

    BUUCTF Web 命令执行 ACTF2020 新生赛 Exec 题目链接 BUUCTF 类型 命令注入 知识点 命令拼接符 解题过程 这道题目比较简单 打开发现是一个ping命令执行页面 使用post接受参数 测试命令拼接符 发现未进行
  • CMW500测试设置及问题处理

    测试CATM1需要打开eMTC Auto Mode 最新的U BLOX R510S模块 这里需要设置为RMC模式 设置为eMTC Auto Mode会出现连接后就断开的情况 没法测试 Measure subframe设置为5 不同的band
  • Kubernetes生产实践系列之三十一:Kubernetes基础技术之CPU资源的调度和管理(CFS)

    一 前言 在使用Kubernetes的过程中 我们看到过这样一个告警信息 K8S 告警主题 CPUThrottlingHigh 告警级别 warning 告警类型 CPUThrottlingHigh 故障实例 告警详情 27 throttl
  • android bluetooth UUID蓝牙查询表

    UUID是 Universally Unique Identifier 的简称 通用唯一识别码的意思 对于蓝牙设备 每个服务都有通用 独立 唯一的UUID与之对应 也就是说 在同一时间 同一地点 不可能有两个相同的UUID标识的不同服务 以
  • .Net C# 使用 IKVM 调用 Java 代码

    相关开源库 https github com ikvm revived 版本号 Net 6 JDK 8 IKVM 8 2 1 IKVM 在 8 2 0 版本中新增加 IkvmReference 在 MSBuild 中配置 自动帮你编译jar
  • 虚拟机打开vim文件以后退出方式

    如果是vi 则 Esc 退出编辑模式 输入以下命令 wq 保存后退出vi 若为 wq 则为强制储存后退出 常用 w 保存但不退出 常用 w 若文件属性为 只读 时 强制写入该档案 q 离开 vi 常用 q 若曾修改过档案 又不想储存 使用
  • python制作查询工具发给别人使用_Python 制作查询商品历史价格的小工具

    一年一度的双十一就快到了 各种砍价 盖楼 挖现金的口令将在未来一个月内充斥朋友圈 微信群中 玩过多次双十一活动的小编表示一顿操作猛如虎 一看结果2毛5 浪费时间不说而且未必得到真正的优惠 双十一电商的 明降暗升 已经是默认的潜规则了 打破这
  • 为何在新建STM工程中全局声明两个宏

    在uVision中新建STM32工程后 需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中 此时需要在工程设置 gt C C 选项卡下的Define文本框中键入这两个全局宏定义 STM32F40 41xxx USE STDPERIP
  • 二叉树的一些练习题

    前言 二叉树的简单题目 通过画栈帧图去理解过程 画一画 走一走递归过程 理解会更加深刻 二叉树练习题 前言 二叉树的创建 二叉树先序遍历创建 PreCreat 二叉树层次创建 LevelCreat 二叉树的销毁 BinaryTreeDest
  • 二分法查找数组元素

    二分法查找元素时可以节省下极高的效率 如果有2的32次方个元素 依次查找需要查找2的32次方次 然而二分查找最多只用查找32次 程序执行的时间极大的缩短 二分法查找元素 include
  • nginx中location里面的try_files配置导致Vue设置history模式下的请求丢失参数

    nginx中location里面的try files配置导致vue设置history模式下的请求丢失参数 背景描述 在一次生产环境中 vue使用history模式在访问地址的参数会丢失 地址栏也会变成没有参数的地址 并且请求会发生301重定
  • 快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解 原理 实现和时间复杂度 快速排序是对冒泡排序的一种改进 由 C A R Hoare Charles Antony Richard Hoare 东尼 霍尔 在 1962 年提出 快速排序的基本思想是 通过一趟排序将要排序的数
  • sql 字段求和_VBA+SQL-常用函数

    SQL语句中的一些简单计算函数 如max函数 SELECT MAX 列字段 AS 别名1 FROM 工作表名 如AVG函数 SELECT AVG 列字段 AS 别名1 FROM 工作表名 使用实例说明 源数据 查询内容 对英语成绩最高分 对
  • 【Java基础】day13

    day13 一 Spring Bean 生命周期是怎样的 详细过程分为以下几个步骤 初始化 Bean 容器通过获取 BeanDefinition 中的信息进行实例化 这一步仅仅是简单的实例化 并没有进行依赖注入 实例化的对象被包装在 Bea
  • 脚手架搭建react项目遇到的问题?

    一 配置proxy代理 配置代理其实很简单 但是理解其中我还不是太懂 贴一下代码看一下配置吧 说一下我遇见的问题 因为以前用webpack配置需要在config里配置devServer 网查脚手架搭建的项目不用这么麻烦 直接package
  • 【100%通过率 】【华为OD机试c++/python】日志限流【2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 某软件系统会在运行过程中持续产生日志 系统每天运行N单位时间 运行期间每单位时间产生的日志条数保行在数组 records中 records i
  • 小程序中的callback使用,及面临的风险

    1 前言 在项目开发中 初步逻辑是 获取用户的openid 2 使用openid去查询用户数据表中是否有这个用户 3 如果没有这个openid的用户 非key字段 新建一条用户数据 但在实际的操作者 发现数据库会存在如下图的情况 数据库中o