|
AC的功能都是通过封装模块实现的,这也决定了其模块数据与html页面执行并不是出于“同一层”,也是广义上的异步模式
但是有时候又必须要同步的调取模块的返回数据,解决的方法就是js的通用做法,通过callback 回调解决
场景:想做个文件上传,用了文件上传模块,但是在上传后要拿到上传的状态等 “内部”参数,而又不能在文件上传模块的内部函数去做下一步处理,原因很多,比如这个文件上传被我们打包成了工具类。。。解决方法就是将文件上传模块打包为一个工具函数,并给回调函数
这个说很难说清楚,即使你去百度异步回调的原理很多大神说了一堆也很难说清楚,而很多大神异步回调用得很熟,但是不一定清楚其原型原理,不管,上代码
function upload(callback){
var model = api.require('model');
model.uploadFile({
report:true,
data:{
file:{
name:file,
url:fileurl
}
}
},function(ret, err) {
if (ret) {
var state = ret.state;
if (state == 0) {//正在传输
if(ret.progress){
}
} else {//传输完成 得到该文件对象 id name size type 等数据库中字段
console.log(ret.id);
callback(ret); //关键点
//arcProgress.close();
}
} else {
api.toast({msg:'上传文件失败'+err,duration:3000,location: 'bottom'});
}
});
}
然后在调用 该方法
//前置代码
....
var data;
upload(function(res){
//res 就是 模块返回的参数数据
//直接可以使用
data=res;
})
alert(data)
完成
在js原生开发中这种方法多见于处理遍历添加事件模型等。。。。
这种方法实用,很巧妙
跟汰渍样,好用不伤手
|
|