您现在的位置:首页 >> JS&Jq >> 内容

jQuery.Form.js 插件的作用是实现Ajax提交表单。 方法: 1.formSeril

时间:2016-5-12 11:36:23 点击:

  核心提示:关于promise模式:promise模式在任何时刻都处于以下三种状态之一: 未完成(unfulfilled) 已完成(resolved) 拒绝(rejected)CommonJS Promise/A...

关于promise模式:

promise模式在任何时刻都处于以下三种状态之一:

未完成(unfulfilled) 已完成(resolved) 拒绝(rejected)

CommonJS Promise/A 标准这样定义的,promise对象上的then方法负责添加针对已完成和拒绝状态下的处理函数。then方法会返回另一个promise对象,这样可以形成“管道”风格。

关于deferred:

对于deferred对象的通俗解释:

一个可链式操作的对象,提供多个回调函数的注册,以及回调列队的回调,并转达任何异步操作成功或失败的消息。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<code class="hljs http">// jQuery. Deferred主要处理:
//     显而易见Deferred是个工厂类,返回的是内部构建的deferred对象
//     tuples 创建三个$.Callbacks对象,分别表示成功,失败,处理中三种状态
//     创建了一个promise对象,具有state、always、then、primise方法
//     扩展primise对象生成最终的Deferred对象,返回该对象
//     primise对象就是一个受限对象,只读
var Deferred = function(func) {
  var tuples = [
    //1 动作
    //2 侦听器
    //3 最终状态
    //后面的操作将是围绕这些接口处理
    ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"],
    ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"],
    ["notify", "progress", jQuery.Callbacks("memory")]
  ],
  state = "pending",
  //扩展的primise对象
  promise = {
    state: function() {},
    always: function() {},
    then: function( /* fnDone, fnFail, fnProgress */ ) {},
    promise: function(obj) {}
  },
  deferred = {};
  //定义管道风格的接口pipe
  promise.pipe = promise.then;
  //逐个添加所有的接口到deferred对象上
  jQuery.each(tuples, function(i, tuple) {
    deferred[tuple[0]] = function() {
      deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments);
      return this;
    };
    deferred[tuple[0] + "With"] = list.fireWith;
  });
  //转成promise对象
  promise.promise(deferred);
  //如果传递的参数是函数,直接运行
  if (func) {
    func.call(deferred, deferred);
  }
  return deferred;
}</code>

Deferred方法内部建议了2个对象,一个是deferred外部接口对象,一个是内部promise对象。

promise对象解释是一个受限的对象, 这就是所谓的受限制的deferred对象,因为相比之前, 返回的deferred不再拥有resolve(With), reject(With), notify(With)这些能改变deferred对象状态并且执行callbacklist的方法了,只能是then、done、fali等方法。

其内部通过tuples数组,存储了所有的接口API,通过遍历把所有的接口一次都挂到内部promise与deferred对象上。

其中定义了done、fail以及progress这几个方法,其实就是Callbacks回调函数中的add方法,用与push外部的数据,保存在队列上。

我们通过resolve、reject以及notify其实也就是处理Callbacks中的队列列表。

两个问题:

1、defer延时对象通过resolved触发done成功回调,调用在添加done之前,那么靠什么延时处理?

2、为什么defer.then对象返回的给filtered.done的数据可以类似管道风格的顺序叠加给后面的done处理?

一般来说,javascript要实现异步的收集,就需要“等待”,比如defer.resolve(5)虽然触发了,但是done的处理还没添加,我们必须要等待done、then等方法先添加了后才能执行了resolve,那么常规的的用法就是在resolve内部用setTimeout 0,image.onerror行成一个异步的等待操作处理。

但是jQuery很巧妙的绕过了这个收集方式,

defer.resolve(5)方法实际就是触发了callback回到函数的fireWith方法,这样可以接受一个上下文deferred与参数5

deferred[tuple[0] + “With”](this === deferred ? promise : this, arguments);
之前 done | fail | progress方法都是通过jQuery.Callbacks(“once memory”) 或 jQuery.Callbacks(“memory”)生成的。

实际上在Callback源码fire方法有一句 memory = options.memory && data;这样就很巧妙的缓存当前参数5的值,提供给下一个使用,这个就是then,pipe链式数据的一个基础了,此刻的操作,我们把memory保存了这个数据的值。

重点来了,下一个defer.done的操作也是走的add的处理,把done的回调函数加入到list队列中的之后,接着就会触发。

// With memory, if we’re not firing then
// we should call right away
} else if (memory) {
firingStart = start;
fire(memory);
}
因为memory在上一个resolve操作的时候,缓存了5了,所以memory的判断显示是为真的,所以立刻就触发了fire(memory)的代码了,所以就算触发的循序与添加的循序不一致,也不会导致错误。 而且jquery很巧妙的避免了异步收集的问题,这样处理更可靠了。可见回调函数模块就是为Deferred模块量身定做的了。

小小体会:

用心看一看还是能看懂的。怎么实现异步的呢?并不是用settimeout来等待后面的触发,而是通过把值储存起来,下一步调用的时候,因为显示储存了值,jquery一看有值哎,认为前面的流程对了,立即触发。 

作者:不详 来源:网络
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 青春网络编程技术(www.qcfupo.com) © 2020 版权所有 All Rights Reserved.
  • Powered by qcfupo! V3.0sp1
  • 百度友情链接: 百家乐[www.chinawestnews.net/aomenbaijiale/] 赌博网[www.chinawestnews.net/amdbwz/] 海立方[www.bjl.gov.cn/bjgylc/] 娱乐城[www.gtxrmzf.gov.cn/mapai/] 娱乐城[www.hfsf.gov.cn/yfgj/] 威尼斯人[www.hllinkou.gov.cn/baijile/] 澳门威尼斯[www.jjwgj.gov.cn/wnsr/] 888真人[www.lagm.gov.cn/888zhenren/] 百乐坊[www.laoling.gov.cn/blfylc/] 现金网[www.longyu.gov.cn/xjw/] 百家乐[www.chinawestnews.net/ambjl/] 新葡京娱乐场[www.sjzedu.gov.cn/jsylc/] 时时彩[www.snjw.gov.cn/ssc/] 赌博[www.chinawestnews.net/aomendubo/]