发表于: 2017-02-07 00:23:58
1 1285
今天完成的事情:
#推介职业的数据导入
#跳转页面实现传参
明天计划的事情:
#小程序的数据相加
#小程序的数据排序
遇到的问题:
#萝卜多暂停,先去做小程序。萝卜多做到选项卡切换,和ui-route的切换当前添加class属性
#数组对象的操作真是纠结的要死,首先嵌套了太多层,导致了取数据太麻烦,后来优化了数据结构,在进行取数据的时候,发现for in取出来的一个字符串,不是对象又纠结了半天,后来拿着这个字符串在for in一次就拿到我要的数据了,真的好伤心!想想明天还要把数据相加。
#
收获:
#小程序的页面传参同步,异步操作,以及数据查找
#今天晚上分享了关于异步操作的几种方法
1.背景介绍
Javascript语言的执行环境是"单线程"一次只能完成一件任务 好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长
2.知识剖析
同步 异步
3.常见问题
问题1 常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。
问题2异步是什么 异步就是让某个函数创建一个别的线程或进程,与JS主线程并行地做一些事情,并在事情做完后通知JS主线程。
4.解决方案
回调函数
事件监听 发布/订阅 Promises对象 5.编码实战 回调函数 //定有两个函数f1和f2,后者等待前者的执行结果。 f1(); f2(); //如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函数。 function f1(callback){ setTimeout(function () { // f1的任务代码 callback(); }, 1000); } //执行代码就变成下面这样: f1(f2);
事件监听
f1.on('done', f2); 上面这行代码的意思是,当f1发生done事件,就执行f2。然后,对f1进行改写: function f1(){ setTimeout(function () { // f1的任务代码 f1.trigger('done'); }, 1000); } 发布/订阅
//下面采用的是Ben Alman的Tiny Pub/Sub,这是jQuery的一个插件。 //首先,f2向"信号中心"jQuery订阅"done"信号。 jQuery.subscribe("done", f2); //然后,f1进行如下改写: function f1(){ setTimeout(function () { // f1的任务代码 jQuery.publish("done"); }, 1000); } jQuery.publish("done")的意思是,f1执行完成后, 向"信号中心"jQuery发布"done"信号,从而引发f2的执行。 //此外,f2完成执行后,也可以取消订阅(unsubscribe)。 jQuery.unsubscribe("done", f2);
Promises对象
//它的思想是,每一个异步任务返回一个Promise对象,该对象有一个then方法 允许指定回调函数。比如,f1的回调函数f2,可以写成: f1().then(f2); // f1要进行如下改写(这里使用的是jQuery的实现): function f1(){ var dfd = $.Deferred(); setTimeout(function () { // f1的任务代码 dfd.resolve(); }, 500); return dfd.promise; } //这样写的优点在于,回调函数变成了链式写法,程序的流程可以看得很清楚 ,而且有一整套的配套方法,可以实现许多强大的功能。 //比如,指定多个回调函数: f1().then(f2).then(f3); //再比如,指定发生错误时的回调函数: f1().then(f2).fail(f3); //而且,它还有一个前面三种方法都没有的好处:如果一个任务已经完成, 再添加回调函数,该回调函数会立即执行。
6.扩展思考 then方法跟单例设计模式
7.参考文献 参考一:异步操作的几种方法
8.更多讨论 无
评论