什么是“;函数(响应){}”;
what is "function(response){}"
当我看到这个页面时,我正在阅读Facebook API,其中有以下片段:
FB.ui({
method: 'feed',
link: 'https://developers.facebook.com/docs/',
caption: 'An example caption',
}, function(response){});
这段代码让我很困惑。如果我的理解是正确的,这是FB.ui
的函数调用,它的第一个参数是对象文字。但是它的第二个参数是什么,这个function(response){}
是什么?在我看来,这应该是一个语法错误。
这是一个回调。因为JS是在浏览器中运行的,所以它不能简单地坐着等待网络请求完成。当服务器发送响应时,浏览器必须关闭并执行其他工作,因此回调用于在某些远程操作完成后回调代码。
这种特殊的模式,包括:
remoteCall(objectParams, responseCallback)
是处理发送到服务器或文件系统的一些请求的一种非常常见的方法。这是一种将实际IO操作放在单独线程中的方法,这样就不会冻结程序的其余部分。
JS中处理异步操作的主要方法有三种:
回调参数
您可以将这些作为函数参数或对象的一部分传递:
remoteCall(objectParams, responseCallback)
remoteCall({
success: responseCallback
})
一旦达到某种状态(完成、失败、进度更改),函数就负责调用您提供的函数。
事件
一种更优雅但有点复杂的处理方式是通过适当的事件。内置的XHR类使用以下内容(来自维基百科文章):
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
var DONE = this.DONE || 4;
if (this.readyState === DONE){
alert(this.readyState);
}
};
在这个模型中,您订阅了一个命名事件,该事件将在将来的某个时间被调用。
DOM(承载脚本的网页)通常使用标准化名称通过事件与脚本交互。MDN有一个DOM事件的页面,它们使用什么信息,以及它们何时被解雇。
承诺(/延期)
这是一个结合了回调和事件的较新模型。jQuery以使用promise的残缺版本而闻名,但对于真正的promise,请求可以变成:
promise.then(function(result) {
console.log(result); // "Stuff worked!"
}, function(err) {
console.log(err); // Error: "It broke"
});
这篇文章(上面的片段来自这里)对事件和承诺进行了极好的比较。
promise最好的实现之一是Bluebird,它有关于模式及其工作方式的精彩文档。
你所看到的
匿名函数(声明为内联,没有名称)用于将函数作为对象传递(因为JS中的函数是对象)。如果函数名为:
function foo() { ... }
// do some things
foo(); // do foo
那么您就可以在同一范围内调用它。如果函数未命名:
var foo = function() { ... }
// do some things
foo(); // do foo
然后你需要一个引用来调用它。这个名称不是发布给任何人使用的。
这是立即调用函数的基础,当加载脚本时,函数可以用来执行一些逻辑:
(function () {
...
}());
该函数在加载时调用自己一次,但没有名称(并且没有分配给变量),从而防止再次调用。
- 存储$http如何从$http函数(Angularjs)外部获取可访问变量中的响应
- 仅在响应视图中激发jQuery函数
- 使用来自不同异步函数的响应创建一个json对象
- 如何执行ajax响应返回的javascript函数
- php函数的XMLHttpRequest响应不包含任何数据
- 获取javascript函数中另一个javascript函数的响应
- 如何发送作为节点请求响应函数中的代码块的响应
- jquery返回ajax响应和用户定义的变量到函数
- 使用命名函数设置多个事件响应
- 如何等待javascript函数响应
- $http.post() angularjs 响应函数未按正确的顺序执行
- 未调用主干解析ajax响应函数
- AngularJS HTTP 资源 - 响应函数未定义
- 如何将 Rails 变量传递给 AJAX 响应函数
- 我无法让我的按钮响应函数
- 使用Cheerio和Response for Node web scraper,将响应函数结果传递给视图
- 在主页中创建按钮以重定向到响应函数
- 转换node.js HTTP响应函数(使用"request"库)来使用流
- Raphael.js弃用函数和响应函数的替代方案
- Angular 1.5 Scope变量在PouchDB响应函数中不起作用