jQuery的链式调用原理,Promise的链式调用,this的问题

最近被问到这个问题,jq的链式调用原理,当时比较懵=。=,毕竟现在jq接触的机会变很少了。

jq的链式调用

jq的链式调用其实就是比如我们在选择dom的时候,

$('input[type="button"]')
    .eq(0).click(function() {
        alert('点击我!');
}).end().eq(1)
.click(function() {
    $('input[type="button"]:eq(0)').trigger('click');
}).end().eq(2)
.toggle(function() {
    $('.aa').hide('slow');
}, function() {
    $('.aa').show('slow');
});

比如如上代码,先选择type类型为button的所有DOM,然后再选择第一个...

我们自然想到每次其实就是返回选择后的结果,在js里面有什么东西可以指代这个吗?
如果你想到this就对了。

jq的方法都是挂在原型的,那么如果我们每次在内部方法返回this,也就是返回实例对象,那么我们就可以继续调用原型上的方法了,这样的就节省代码量,提高代码的效率,代码看起来更优雅。

但是也会出现一个问题:所有对象的方法返回的都是对象本身,也就是说没有返回值,所以这种方法不一定在任何环境下都适合。

Promise的链式调用

promise的链式调用如:

function start() {
    return new Promise((resolve, reject) => {
      resolve('start');
    });
  }  

  start()
    .then(data => {
      // promise start
      console.log('result of start: ', data);
      return Promise.resolve(1); // p1
    })
    .then(data => {
      // promise p1
      console.log('result of p1: ', data);
      return Promise.reject(2); // p2
    })
    .then(data => {
      // promise p2
      console.log('result of p2: ', data);
      return Promise.resolve(3); // p3
    })
    .catch(ex => {
      // promise p3
      console.log('ex: ', ex);
      return Promise.resolve(4); // p4
    })
    .then(data => {
      // promise p4
      console.log('result of p4: ', data);
    });  

Promise的then其实都是实现了 thenable 接口,每个 then 都返回一个新的promise,除了第一个是start的实例其他的已经不是一个promise了。

reject的下面的then都会跳过,只有catch才会捕捉到。

promise的链式调用就和jq完全不一样了,promise链式调用的特点:

关于Promise的实现,我做了一个简单的promise:

function easyPromise(fn) {
    var that = this;
    this.then = function (cb) {
        that.cb = cb;
      }
    this.resolve = function (data) {
        that.cb(data);
    }

    fn(this.resolve);
}

new easyPromise((resolve)=>{
    setTimeout( ()=> {
        resolve("延迟执行");
    },1000);
}).then( (data) => {
    console.log(data);
} )

可以简写成

// 定义一个要传给 promise 的函数,它接收一个函数(resolve)作为参数。
// resolve 的作用是在合适的时间,通知 promise 应该要执行 then 里面的回调函数了。
function promiseCallback (resolve) {
    setTimeout(() => {
       resolve("延时执行")
    }, 1000)
 }

 // 定义一个 要传给 then 的回调函数
 function thenCallback (data) {
     console.log(data)
 }

 // 实例化 promis,并分别传入对应的回调
 new easyPromise(promiseCallback)
 .then(thenCallback)

1.先通过 then 把 thenCallback 存起来
2.执行 promise 括号里的函数,并把事先定义好的 resolve 函数作为参数传给他

fn(this.resolve)

3.执行 promiseCallback 我们的逻辑就跳到 promiseCallback 函数内部去

setTimeout(() => {
  resolve("延时执行")
}, 1000)

逻辑很简单,就是等待1秒后,执行 resolve 函数, 这个 resolve 哪来的呢?
fn(this.resolve) -> promiseCallback (resolve) -> resolve

4.执行 resolve 我们的逻辑就跳到 resolve 函数内部去

that.cb(data)

这个 that.cb 又是哪来的呢? 就是我们第一步保存的 then括号里面的回调函数,也就是 thenCallback

console.log(data)

所以就在1秒后输出 延时执行

关于this

this是js函数运行过程中的一个对象,环境对象。

诶,自己总结的发现还是没阮老师的好。。所以还是看阮老师的吧,链接

原文地址:https://www.cnblogs.com/zhangmingzhao/p/9484903.html

时间: 2024-11-05 22:35:00

jQuery的链式调用原理,Promise的链式调用,this的问题的相关文章

jquery中链式调用原理

(1).链式调用 $("#mybtn").css("width","100px") .css("height","100px") .css("background","red"); (2).在对属性进行操作时建议使用JSON形式控制样式 $("#mybtn").css({    width:200,    height:"200"

Swift-可空链式调用(Optional Chaining)(十五)

前言 其实可空链式调用并没有它的名字那么陌生,简而言之就是对于可选类型Optional(使用问号 ? 后缀表示)和强制展开类型(使用感叹号 ! 后缀表示)的使用方法.在平常写代码的时候只是大概的清楚哪些值是可空的,哪些值是肯定存在的,但是并没有深究可空的调用有何优点,有何使用时需要注意的事项.至少前面写不少示例代码的时候,我也是大都按照自己的想法去定义的.这一小节就是对可空调用的详细描述,至于链式,就是多层调用,大概就是school.classroom.student.name这样的调用方法.

链式调用方法的实现原理和方法

1.什么是链式调用? Person person = new Person().setName(fog) .setAge(18) .setSex(man) .setJob(software engineer); 2.优势和好处 有以上的代码,好处显而易见:代码量大幅度减少,逻辑集中清晰明了,且易于查看和修改. 3.背后的实现原理 一般而言,我们在设置set,get的方法的时候,在对应的方法里都是返回的void. 从某种意义上来说,代码的返回值是一个必须要执行的步骤,直接返回void是一种浪费,而

模拟jQuery底层源码的链式调用和常用的$()方法的实现

最近在看jQuery框架的源码,感觉还是学到不少东西的,所以就想总结一下自己的知识,和广大的前端爱好者一起 交流一下,我下面所说的并不是直接对jQuery的源码来解读,我是模拟一下jQuery底层源码的链式调用大概是怎么 实现的和常用的$功能是怎么实现的.好了废话不多说了.你要看这个,你就要对jQuery有一定的了解,最起码你要用过jQuery.首先看下jQuery的源码开始是怎么写的 (function( window, undefined){    })(window);它的代码就是被这个块

使用 jQuery Deferred 和 Promise 创建响应式应用程序

这篇文章,我们一起探索一下 JavaScript 中的 Deferred 和 Promise 的概念,它们是 JavaScript 工具包(如Dojo和MochiKit)中非常重要的一个功能,最近也首次亮相于 流行的 JavaScript 库 jQuery(已经是1.5版本的事情了). Deferred 提供了一个抽象的非阻塞的解决方案(如 Ajax 请求的响应),它创建一个 “promise” 对象,其目的是在未来某个时间点返回一个响应.如果您之前没有接触过 “promise”,我们将会在下面

方法的链式调用【参考javascript设计模式第6章】

对应经常使用jquery的朋友,方法的链式调用应该是已经很属性了,书上有模拟出一个很简单的类库代码, 见代码如下: Function.prototype.method = function(name,fn){ this.prototype[name] = fn; return this; }; (function(){ function _$(els){ ........ } /*Events  addEvent getEvent*/ _$.method("addEvent",func

通过JavaScript中的链式方法实现JQuery的链式调用

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>实现JQuery的链式调用</title> </head> <body> <script> function A(){} A.prototype.v = 2; A.prototype.set = function(num)

实现函数,类似jQuery链式调用.

1 var origin = [ 2 {id:1,title:'title1'}, 3 {id:2,title:'abcd'}, 4 {id:3,title:'title2'}, 5 {id:4,title:'efg'} 6 ]; 7 8 var find = function(data){ 9 // your code here 10 } 11 12 var result = find(origin).where({'title':/\d$/}).order('id','desc'); //d

如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用

1.以$ 函数为例.通常返回一个HTML元素或一个元素集合. 代码如下: function $(){ var elements = []; for(var i=0;i<arguments.length;i++){ var element = argument[i]; if(typeOf element == "String") { element = document.getElementById(element); } if ( arguments.length === 1)