1.前言
在项目开发中,初步逻辑是:
-
获取用户的openid----》
2.使用openid去查询用户数据表中是否有这个用户---》
3.如果没有这个openid的用户(非key字段),新建一条用户数据;
但在实际的操作者,发现数据库会存在如下图的情况:
2.why
查阅资料发现是,因为网络的原因,前面的openid获取还未完成,后面的写入函数已经开始执行了。
3.how
在看到一个比较不错的源码时,发现作者写了很多的callback。如图
查阅发现这些就是传说的回调函数,犹记得上次接触这个词语还是在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.道
法布施得智慧吧。