最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript 異步方法隊(duì)列鏈實(shí)現(xiàn)代碼分析

 更新時(shí)間:2010年06月05日 00:37:57   作者:  
在javascript中,方法的鏈?zhǔn)秸{(diào)用很流行,使用jQuery的朋友對此一定深有體會。

在《javascript設(shè)計(jì)模式》中對這種方法作了比較詳細(xì)的描述,實(shí)現(xiàn)方法的鏈?zhǔn)秸{(diào)用,只須讓在原型中定義的方法都返回調(diào)用這些方法的實(shí)例對象的引用即可,看看書中的這段代碼:

復(fù)制代碼 代碼如下:

(function() {
function _$(els) {
this.elements = [];
for (var i = 0, len = els.length; i < len; ++i) {
var element = els[i];
if (typeof element == 'string') {
element = document.getElementById(element);
}
this.elements.push(element);
}
};
_$.prototype = {
each: function(fn) {
for ( var i = 0, len = this.elements.length; i < len; ++i ) {
fn.call(this, this.elements[i]);
}
return this;
},
setStyle: function(prop, val) {
this.each(function(el) {
el.style[prop] = val;
});
return this;
},
show: function() {
var that = this;
this.each(function(el) {
that.setStyle('display', 'block');
});
return this;
},
addEvent: function(type, fn) {
var add = function(el) {
if (window.addEventListener) {
el.addEventListener(type, fn, false);
}
else if (window.attachEvent) {
el.attachEvent('on'+type, fn);
}
};
this.each(function(el) {
add(el);
});
return this;
}
};
window.$ = function() {
return new _$(arguments);
};
})();

可以看到,每個(gè)方法都以”return this”結(jié)束,這就會將調(diào)用方法的對象傳遞給鏈上的下一個(gè)方法。但是,如果我們要操作的數(shù)據(jù)是通過異步請求來獲得的,如何保持方法的鏈?zhǔn)秸{(diào)用呢?Dustin Diaz為我們提供了一種方法來保證方法的鏈?zhǔn)秸{(diào)用,他也是《javascript設(shè)計(jì)模式》一書的作者之一。
他首先構(gòu)建了一個(gè)Queue對象,即:
復(fù)制代碼 代碼如下:

function Queue() {
// store your callbacks
this._methods = [];
// keep a reference to your response
this._response = null;
// all queues start off unflushed
this._flushed = false;
}
Queue.prototype = {
// adds callbacks to your queue
add: function(fn) {
// if the queue had been flushed, return immediately
if (this._flushed) {
fn(this._response);
// otherwise push it on the queue
} else {
this._methods.push(fn);
}
},
flush: function(resp) {
// note: flush only ever happens once
if (this._flushed) {
return;
}
// store your response for subsequent calls after flush()
this._response = resp;
// mark that it's been flushed
this._flushed = true;
// shift 'em out and call 'em back
while (this._methods[0]) {
this._methods.shift()(resp);
}
}
};

然后用它作為工具構(gòu)建我們的異步方法隊(duì)列鏈。有了這個(gè)工具,就可以很方便的構(gòu)建一個(gè)從服務(wù)器端獲取內(nèi)容并將其附加到選擇器中的jQuery plugin。
復(fù)制代碼 代碼如下:

(function($) {
$.fn.fetch = function(url) {
var queue = new Queue;
this.each(function() {
var el = this;
queue.add(function(resp) {
$(el).html(resp);
});
});
$.ajax({
url: url,
dataType: 'html',
success: function(html) {
queue.flush(html);
}
});
return this;
};
})(jQuery);

這樣,我們就可以異步的獲取內(nèi)容,并繼續(xù)我們的鏈?zhǔn)秸{(diào)用。
復(fù)制代碼 代碼如下:

$("<div/>")
.fetch('/server/navigation.html')
.addClass('column')
.appendTo('#side');

查看demo頁看看效果。
如果一個(gè)隊(duì)列中有很多項(xiàng)等待對服務(wù)器端的響應(yīng)進(jìn)行操作,該如何處置?作者構(gòu)建了這樣一個(gè)方法,值得參考:
復(fù)制代碼 代碼如下:

function fetchTweet(url) {
this.queue = new Queue;
this.tweet = "";
var self = this;
ajax(url, function(resp) {
self.tweet = resp;
self.queue.flush(this);
});
}
fetchTweet.prototype = {
linkify: function() {
this.queue.add(function(self) {
self.tweet = self.tweet.replace(/\b@(\w{1,20}\b/g, '$1');
});
return this;
},
filterBadWords: function() {
this.queue.add(function(self) {
self.tweet = self.tweet.replace(/\b(fuck|shit|piss)\b/g, "");
});
return this;
},
appendTo: function(selector) {
this.queue.add(function(self) {
$(self.tweet).appendTo(selector);
});
return this;
}
};

這樣,我們就可以用下面的方式來調(diào)用:
復(fù)制代碼 代碼如下:

fetchTweet(url).linkify().filterBadWords().appendTo('#status');

到此,我們已經(jīng)知道了如何實(shí)現(xiàn)異步方法鏈?zhǔn)秸{(diào)用,但在《Asynchronous method queue chaining in JavaScript》底部的一些評論提出的一些問題,值得思考一下。插件$.fn.fetch中僅僅只需將返回的內(nèi)容附加到元素之中,Queue是否必要?而且,jQuery中的$.fn.load完全可以實(shí)現(xiàn),如果Queue中只用一個(gè)回調(diào)函數(shù),完全可以這樣來寫:
復(fù)制代碼 代碼如下:

(function($) {
$.fn.fetch = function(url) {
var queue = new Queue;
this.each(function() {
var el = this;
$.ajax({
url: url,
type: 'get',
dataType: 'json',
success: function(resp) {
$(el).html(resp['text1']);
}
});
});
return this;
};
})(jQuery);

不知你作如何感想?

相關(guān)文章

  • js計(jì)算德州撲克牌面值的方法

    js計(jì)算德州撲克牌面值的方法

    這篇文章主要介紹了js計(jì)算德州撲克牌面值的方法,實(shí)例分析了javascript計(jì)算撲克面值的算法技巧,需要的朋友可以參考下
    2015-03-03
  • 網(wǎng)頁掛馬方式整理及詳細(xì)介紹

    網(wǎng)頁掛馬方式整理及詳細(xì)介紹

    這篇文章主要介紹了網(wǎng)頁掛馬方式整理及詳細(xì)介紹的相關(guān)資料,這里整理了不少方式,大家可以看下如何實(shí)現(xiàn)的,需要的朋友可以參考下
    2016-11-11
  • 給ListBox添加雙擊事件示例代碼

    給ListBox添加雙擊事件示例代碼

    如何給ListBox添加雙擊事件,想必有很多的新手朋友們都不會吧,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下
    2013-12-12
  • 原生js實(shí)現(xiàn)碰撞檢測

    原生js實(shí)現(xiàn)碰撞檢測

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)碰撞檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • javascript canvas時(shí)鐘模擬器

    javascript canvas時(shí)鐘模擬器

    這篇文章主要為大家詳細(xì)介紹了javascript canvas時(shí)鐘模擬器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • js 連續(xù)賦值的簡單實(shí)現(xiàn)

    js 連續(xù)賦值的簡單實(shí)現(xiàn)

    下面小編就為大家?guī)硪黄猨s 連續(xù)賦值的簡單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • 一文幫你理解PReact10.5.13源碼

    一文幫你理解PReact10.5.13源碼

    這篇文章主要介紹了一文幫你理解PReact10.5.13源碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • webpack proxy 使用(代理的使用)

    webpack proxy 使用(代理的使用)

    這篇文章主要介紹了webpack proxy 使用(代理的使用),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • js仿微信搶紅包功能

    js仿微信搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了js仿微信搶紅包功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • JS監(jiān)聽一個(gè)變量改變的兩種方法

    JS監(jiān)聽一個(gè)變量改變的兩種方法

    在業(yè)務(wù)中,由于項(xiàng)目采用微前端架構(gòu),需要通過A應(yīng)用的某個(gè)值的變化對B應(yīng)用中的DOM進(jìn)行改變(如彈出一個(gè)Modal),第一個(gè)想到的可能是發(fā)布訂閱模式,其實(shí)不如將問題縮小化,采用原生的能力去解決,本文介紹了兩種方法來使用JS監(jiān)聽一個(gè)變量改變,需要的朋友可以參考下
    2023-11-11

最新評論

邳州市| 华坪县| 开原市| 和静县| 佛山市| 壶关县| 桐梓县| 邹平县| 澄迈县| 林州市| 共和县| 龙江县| 嘉禾县| 滦平县| 邹平县| 马关县| 甘南县| 宝兴县| 曲麻莱县| 正安县| 黄陵县| 波密县| 合阳县| 灵山县| 锡林郭勒盟| 绵阳市| 贞丰县| 泌阳县| 木兰县| 和龙市| 墨江| 明光市| 逊克县| 吉林市| 寿光市| 鹤岗市| 萨嘎县| 汶上县| 玉龙| 青岛市| 苗栗县|