{"action":"opened","issue":{"url":"https://api.github.com/repos/skykobe/MyLearningNote/issues/12","repository_url":"https://api.github.com/repos/skykobe/MyLearningNote","labels_url":"https://api.github.com/repos/skykobe/MyLearningNote/issues/12/labels{/name}","comments_url":"https://api.github.com/repos/skykobe/MyLearningNote/issues/12/comments","events_url":"https://api.github.com/repos/skykobe/MyLearningNote/issues/12/events","html_url":"https://github.com/skykobe/MyLearningNote/issues/12","id":137060032,"number":12,"title":"2.28（突然想了很多关于JS的异步以及回调函数）","user":{"login":"skykobe","id":12881944,"avatar_url":"https://avatars.githubusercontent.com/u/12881944?v=3","gravatar_id":"","url":"https://api.github.com/users/skykobe","html_url":"https://github.com/skykobe","followers_url":"https://api.github.com/users/skykobe/followers","following_url":"https://api.github.com/users/skykobe/following{/other_user}","gists_url":"https://api.github.com/users/skykobe/gists{/gist_id}","starred_url":"https://api.github.com/users/skykobe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/skykobe/subscriptions","organizations_url":"https://api.github.com/users/skykobe/orgs","repos_url":"https://api.github.com/users/skykobe/repos","events_url":"https://api.github.com/users/skykobe/events{/privacy}","received_events_url":"https://api.github.com/users/skykobe/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2016-02-28T14:50:39Z","updated_at":"2016-02-28T14:50:39Z","closed_at":null,"body":"之前一直以为只要是异步，那么对应的特征————回调函数就一定会出现，今天才知道这想法是多么的可笑。\r\n先提一下：\r\n#### 回调函数：顾名思义，回来调用的函数，即当后面的JS代码块运行完以后才回来一一调用，这里涉及到函数的队列，当然这是通俗的理解。学术的就是将函数作为参数传到需要回调的函数内部再执行。\r\n### 但其实，异步是一个模式\r\n异步模式的四种方式：\r\n1.回调函数callback\r\n所谓回调函数，就是将函数作为参数传到需要回调的函数内部再执行。\r\n典型的例子就是发送ajax请求。例如：\r\n     $.ajax({\r\n    async: false, \r\n    cache: false,\r\n    dataType: 'json',\r\n    url: \"url\",\r\n    success: function(data) {\r\n      console.log('success');\r\n    },\r\n    error: function(data) {\r\n     console.log('error');\r\n    }\r\n  })\r\n\r\n当发送ajax请求后，等待回应的过程不会堵塞程序运行，耗时的操作相当于延后执行。\r\n回调函数的优点在于简单，容易理解，但是可读性较差，耦合度较高，不易于维护。\r\n\r\n2.事件驱动\r\njavascript可以称之为是基于对象的语言，而基于对象的基本特征就是事件驱动（Event-Driven）。\r\n事件驱动，指的是由鼠标和热键的动作引发的一连串的程序操作。\r\n例如，为页面上的某个绑定click事件；\r\n$('#btn').onclick(function(){\r\n   console.log('click button');\r\n});\r\n\r\n绑定事件相当于在元素上进行监听，是否执行注册的事件代码取决于事件是否发生。\r\n优点在于容易理解，一个元素上可以绑定多个事件，有利于实现模块化；但是缺点在于称为事件驱动的模型后，流程不清晰。\r\n\r\n3.发布/订阅\r\n\r\n发布订阅模式（publish-subscribe pattern）又称为观察者模式(Observer pattern)。\r\n该模式中，有两类对象：观察者和目标对象。目标对象中存在着一份观察者的列表，当目标对象\r\n的状态发生改变时，主动通知观察者，从而建立一种发布/订阅的关系。\r\njquery有相关的插件，在这不是重点不细说了。。。。回头写个实现贴上来\r\n\r\n\r\n4.promise模式\r\npromise对象是CommonJS工作组提供的一种规范，用于异步编程的统一接口。\r\npromise对象通常实现一种then的方法，用来在注册状态发生改变时作为对应的回调函数。\r\n\r\npromise模式在任何时刻都处于以下三种状态之一：未完成（unfulfilled）、已完成（resolved）和拒绝（rejected）。以CommonJS Promise/A 标准为例，promise对象上的then方法负责添加针对已完成和拒绝状态下的处理函数。then方法会返回另一个promise对象，以便于形成promise管道，这种返回promise对象的方式能够支持开发人员把异步操作串联起来，如then(resolvedHandler, rejectedHandler); 。resolvedHandler 回调函数在promise对象进入完成状态时会触发，并传递结果；rejectedHandler函数会在拒绝状态下调用。\r\nJquery在1.5的版本中引入了一个新的概念叫Deferred，就是CommonJS promise A标准的一种衍生。可以在jQuery中创建\r\n$.Deferref的对象。同时也对发送ajax请求以及数据类型有了新的修改，参考JQuery API。"}}