JavaScript中的两个返回是什么意思



我正在阅读有关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方法的函数文字的一部分。它没有立即执行。

这是时间表:

  1. getPost返回方法链$.getJSONthen的结果,这是一个承诺对象。
  2. 完成$.getJSON发起的AJAX调用后,将传递给then的功能被调用。此功能称为回调。
  3. 最后,回调函数执行,这是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,那时将不会返回任何内容。

最新更新