0

なぜこのコードが機能しないのか不思議です。

これが私がすることです:

  • 電子メールとキーを使用して、機能するスクリプトへのパスを取得します。

  • スクリプトがあれば、ajax リクエストを実行して関数にアクセスします - getScriptUrlPersonalizationValue ;

  • この関数は値を取得します。この場合は country: United Statesの値です。

  • なぜ 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 を返すだけで、すべてを 1 つのレベルで処理することをお勧めします。必要に応じて、複数の「then」を連鎖させることができます。

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 に答える