jQuery.when,不能得到加塔

时间:2013-10-25 22:33:28

标签: javascript jquery

我想知道为什么这段代码不起作用。

以下是我的工作:

  • 使用电子邮件和密钥,我获得了一个有效的脚本路径;

  • 有了脚本,我做了ajax请求并访问了一个函数 - getScriptUrlPersonalizationValue ;

  • 此函数为我提供一个值,在本例中为国家/地区的值:美国;

  • 我想知道为什么jQuery.when和.done函数不会返回国家/地区值。

我可以全局保存它,但我想学习javaScript,我想知道为什么会失败。

我试图对代码进行评论,这比上面给出的解释要好得多。

function getData(key) {

    var email = 'myemail@test.com',
        url = getScriptUrl(key, email); // returns the valid url towards the script

    return jQuery.ajax({
                url : url,
                dataType : 'script'
            }).then(function() {
                country = getScriptUrlPersVal('Country');

                console.log(country); // returns: 'United States'

                // And I pass it:

                return country;
            });
}

jQuery.when( getData() ).then(function (data, textStatus, jqXHR) {

    console.log(data); // returns: undefined - should return United States
    console.log(textStatus); // returns: success
    console.log(jqXHR);  // returns: Object { readyState=4, status=200, statusText="success", more...}

});

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

.then()处理程序是独占的,不共享数据,正如其他人所提到的,这解释了为什么getData的.then()中的返回没有意义。最好只返回附加没有.then()的jQuery.ajax,并在一个级别处理它。如果需要,您可以将几个“然后”链接在一起。

function getData(key) {
    var email = 'myemail@test.com',
        url = getScriptUrl(key, email); // returns the valid url towards the script

    return jQuery.ajax({
                url : url,
                dataType : 'script'
           });
}

jQuery.when(getData()).then(function (data, textStatus, jqXHR) {
    country = getScriptUrlPersVal('Country');
    console.log(country); // returns: 'United States'
    console.log(data); // returns: undefined - should return United States
    console.log(textStatus); // returns: success
    console.log(jqXHR);  // returns: Object { readyState=4, status=200, statusText="success", more...}
});

这是使用承诺的经典问题 - 如果你不小心,你可以得到真正的毛茸茸的分支。你可以越简单地保持链条越好。

答案 1 :(得分:0)

尝试向AJAX响应数据添加属性,而不是返回值。

function getData(key) {

    var email = 'myemail@test.com',
        url = getScriptUrl(key, email); // returns the valid url towards the script

    return jQuery.ajax({
                url : url,
                dataType : 'script'
            }).then(function(data, textStatus, jqXHR) {
                country = getScriptUrlPersVal('Country');

                console.log(country); // returns: 'United States'

                // Try to set your country to data object of ajax response.
                data.country = country;
            });
}

jQuery.when( getData() ).then(function (data, textStatus, jqXHR) {
     console.log(data); // should return object with property .country
});

P.S。我不确定该解决方案是否有效,但你可以试试。