我正在阅读有关Promises的博客文章,我找到了此代码,我不确定这是如何工作的?
function getPost(id) {
return $.getJSON('/posts/'+ id).then(function(data, status, xhr) {
return data;
});
}
当我尝试此功能时,它总是会给我回报$.getJSON
的默认值,但是第二个return data;
是什么意思?
谢谢
第二个return
属于为.then()
方法定义的匿名回调方法。如果将格式更改为标准化较低的事物,则将更容易可视化:
function getPost(id) {
return $.getJSON('/posts/'+ id).then(
function(data, status, xhr) {
return data;
}
);
}
如果您完全不使用匿名函数,则看起来像这样:
function jsonCallback(data, status, xhr) {
return data;
}
function getPost(id) {
return $.getJSON('/posts/'+ id).then(jsonCallback);
}
通常,类似的东西只是在您的问题中设置,但是将它们分开可以使初学者更容易看到。
基本上,我们可以假设.then()
方法将另一个函数作为参数(上面的匿名方法/jsonCallback
)。在其中,它可能具有(或至少调用)一些看起来像这样的代码:
function then(callback) {
if(callback && typeof(callback) === typeof(Function) {
callback(data, status, xhr); // data, status, and xhr are probably defined eslewhere in the object
}
}
这绝对是JQuery deferred.then()
方法的过于简单的例子,但是您明白了。
语句return data;
是传递给then
方法的函数文字的一部分。它没有立即执行。
这是时间表:
-
getPost
返回方法链$.getJSON
和then
的结果,这是一个承诺对象。 - 完成
$.getJSON
发起的AJAX调用后,将传递给then
的功能被调用。此功能称为回调。 - 最后,回调函数执行,这是
return data;
实际运行的时间。
getPost
方法返回 getJSON
的返回结果,然后将闭合传递给then
返回data
。
仔细观察返回语句的范围。一个人从匿名函数返回回调数据,该函数返回函数的所有数据
,因此,如果您查看$.getJSON('/posts/' + id)
,您会发现返回的对象在其中,在其中,该函数在该函数中是以下代码
function (a,b,c){i.done(a).fail(b).progress(c);return this}
因此,当调用该方法时,请说明是否呼叫此getJSON
方法在返回的内容中成功,然后继续运行此功能。那是当时方法的i.done(a)
部分。因此,可以说您跑了
$.getJSON('/apicall').then(function () {alert ("Success");})
运行会警报浏览器成功时,如果您要运行
也是如此$.getJSON('/apicall').then(function () {alert ("Success");}).done(function() {alert("DONE");})
您将获得警报成功,然后被警报完成,因为API调用已完成。另外,如果您查看$.getJSON
调用,您会发现以下内容在该方法
function (a,b,c){return f.get(a,b,c,"json")}
所以,如果您现在在控制台中跑步
$.get('/asdf').then(function () { alert("Success");}).done(function () { alert("Done");})
您将能够看到我的意思。至于所说的返回数据声明,返回检索到的数据JSON数据。但是,它不会将其归还在任何地方,这很奇怪。因此,如果您打电话给getPost
,那时将不会返回任何内容。