0

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

这是我所做的:

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

  • 有了脚本,我做了一个 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...}

});

有任何想法吗?

谢谢!

4

2 回答 2

1

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

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...}
});

这是使用 Promise 的一个经典问题——如果你不小心,你会得到非常多毛的分支。保持链条越简单越好。

于 2013-10-25T22:59:20.560 回答
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
});

PS我不确定该解决方案是否有效,但您可以尝试。

于 2013-10-25T23:01:39.723 回答