1

このフォーラムや他のフォーラムからいくつかの解決策を試しましたが、何もうまくいかないようです。これが論理的な問題であり、単に私が望む方法で実行できないのか、それとも正しい方法でリターンにアクセスしていないのかはわかりません。

私がやろうとしているのは、一連のリンクをリストすることです (コードは外部ファイル Main.js にあります)。リンクをクリックすると、ID を取得し、それを使用して 2 番目の ajax 呼び出しを行い、開くと 2 番目のウィンドウも開きます。 (コードは外部ファイル Cites.js にあります) をクリックすると、リンクに関する詳細情報が表示されます。

問題は、私の Cites.js ファイルで使用される Main.js の 2 番目の ajax 呼び出しから ID を取得できないことです。2 番目の ajax 呼び出しを返し、.done() を使用して、返されたデータを取得するか、グローバル変数 projectId を取得しようとしています。

これが私のMain.jsのコードです

var projectId = '';
var promise = $.ajax({
    type: 'GET',
    url: 'https://www.sciencebase.gov/catalog/items?parentId=504108e5e4b07a90c5ec62d4&max=60&offset=0&format=jsonp',
    jsonpCallback: 'getSBJSON',
    contentType: "application/json",
    dataType: 'jsonp'
    }).then(function(json) {
                 var linkBase = "http://www.sciencebase.gov/catalog/item/";
                 var link = "";                     
                 var itemId = "";                    
                 var urlId = "";
                 var itemLinkLength = "";

                 $.each(json.items, function(i,item) {
                     link = linkBase + this.id;

                     $('#sbItems').append('<li><b><a href="' + link + '" id="idNum' + i + ' ">' + this.title + '</a> - </b>' + this.summary + '</li>');                     
                 });                     

                 $('#sbItems a').on('click', function (e) {
                     e.preventDefault();                         

                     var str = $(this).attr('id');                         

                     if (str.length == 7) {                      
                          itemId = str.slice(5,6);
                     } else if (str.length == 8) {
                          itemId = str.slice(5,7);
                     }

                     urlId = json.items[itemId].id;
                     //alert(urlId);

                     return $.ajax({
                                    type: 'GET',
                                    url: 'https://www.sciencebase.gov/catalog/itemLink/' + urlId + '?format=jsonp',
                                    jsonpCallback: 'getSBJSON',
                                    contentType: "application/json",
                                   dataType: 'jsonp',
                                   success: function(json) {
                                            if (json.length > 0) {
                                                projectId = json.id;
                                                window.open('Citations.html', '_self');
                                            } else {
                                                var page = linkBase + urlId;
                                                window.open(page);
                                            }

                                   },
                                   error: function(e) {
                                       console.log(e.message);
                                   }                     
                     }); // END 2nd ajax
                }); // END Click event
}); // END promise

Cites.jsでそれを呼び出す方法は次のとおりです

promise.done(function () {
    alert(projectId);
});

助けてくれてありがとう

4

1 に答える 1

0

あなたはそうしますpromise = $.ajax(…).then(function(){…})- まだthenメソッドは無名関数の結果に対して新しい約束を作成します (jQuery の古いバージョンではこれは でしたpipe) - pipe() and then() documentation vs reality in jQuery 1.8も参照してください。

ただし、 anon 関数からは何も返さないため、 では何も受け取りませんpromise.done()

チェーン ajax->click->ajax->done を実行する場合は、クリック ハンドラーの promise を手動で作成する必要があります。

于 2013-02-21T21:31:42.850 に答える