6
function Observer() {
    this.fns = [];
}

Observer.prototype = {
    subscribe : function(fn) {
        this.fns.push(fn);
    },

    unsubscribe : function(fn) {
        this.fns = this.fns.filter(
            function(el) {
                if ( el !== fn ) {
                    return el;
                }
            }
        );
    },

    fire : function(o, thisObj) {
        var scope = thisObj || window;
        this.fns.forEach(
            function(el) {
                el.call(scope, o);
            }
        );
    }
};


var fn = function() {};

var o = new Observer;
o.subscribe(fn);
o.fire('here is my data');
o.unsubscribe(fn);

我无法理解这背后的整个概念。我想在我的项目中实现这种模式。我有一个表单被提交的视图,它调用一个 WebService 并返回给我响应。

如果我必须在我的项目中实现这个,这是一个简单的请求和响应......我将如何处理它?我知道当有变化时你会通知你的观察者......让我向我的 API 发出请求,然后我得到响应......现在我希望它通过可观察模式得到通知给我的视图

4

2 回答 2

4

Observer 似乎是您调用的构造函数,var o = new Observer();然后o将是一个引用一堆函数的对象。您可以通过 将函数添加到列表中subscribe。并通过从列表中删除它们unsubscribe

那么这一切的重点就是“ fire”方法,它将遍历函数列表,然后一一调用每个函数。"observer pattern"看起来很像单例模式

你熟悉watchJavaScript 中的 " " 方法吗?它是一种通过 Firefox 支持的方法,您可以在任何对象上使用它。

document.myform.myfield.watch('value', function (v) {
    alert(v);
    return v;
})

然后每当对象的值发生变化时,watch都会调用该函数。所以基本上观察者模式背后的概念是你想以跨浏览器的方式基本上模拟 Firefox 的 watch 方法

您将一堆函数或对象的引用扔到订阅list.then中,并Observer.fire在每个被监视的对象或函数上调用回调方法。这样,如果用户执行某种操作(例如单击),则整个函数列表将通过回调函数更新

我希望这有帮助。

于 2012-04-25T11:13:46.103 回答
0

如果您只想做一个简单的请求,那么在 jQuery(例如 with$.ajax(...)$.get(...))中看起来像这样:

var requestUrl = "text.html";

// Callback is defined here
var viewCallback = function(data) {
   // this will be called when the request is done
   console.log('view is notified');
   console.log('data looks like this:');
   console.log(data);

   // you could chain method calls to other callbacks here if you'd like
};

// Request is done here
$.ajax({
  url: requestUrl,
}).done(viewCallback);

大多数情况下,在执行上述代码足够的请求时,您只想做一件事。使用 jQuery 或 mootools 等 javascript 库将抽象出 XMLHttpRequest 对象的奇怪之处。

但是,如果您想做更高级的事情,我建议您查看执行此类操作的库,例如Radio.js

于 2012-04-25T11:05:12.843 回答