2013-02-21 23 views
1

我試過這個論壇和其他人的幾個解決方案,但似乎沒有任何工作。我不確定這是否是一個邏輯問題,只是不能按照我想要的方式完成,或者我只是沒有以正確的方式訪問回報。爲什麼我沒有得到任何數據時,試圖使用從我的ajax呼叫返回的承諾

我想要做的是列出一組鏈接(代碼是在一個外部文件Main.js),當鏈接被點擊時採取id並用它來做第二個Ajax調用,並打開也將打開第二個窗口(代碼位於外部文件Cites.js中),並提供更多關於點擊鏈接的信息。

問題是我無法從我的Cites.js文件中使用的Main.js中的第二次ajax調用獲得id。我試圖返回第二個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); 
}); 

感謝您的幫助

+0

你爲什麼從click處理程序返回一個ajax承諾? – Bergi 2013-02-21 21:25:43

+0

當我嘗試在單擊事件之外執行此操作時,我無法獲取該id,然後在ajax調用中使用它以首先查看它是否返回大於0的長度。所以,我在 – jc72 2013-02-21 21:29:09

回答

0

你做promise = $.ajax(…).then(function(){…}) - 但then方法確實爲匿名函數的結果創建了新的承諾(在jQuery的舊版本中,這是pipe) - 請參閱al所以pipe() and then() documentation vs reality in jQuery 1.8

但是,由於您不會從anon函數中返回任何內容,因此您將不會收到任何內容promise.done()

如果你想做一個鏈ajax-> click-> ajax-> done,你將需要手動構建點擊處理程序的承諾。

+0

之內完成了所有操作我可以以某種方式分配一些東西到我的全局變量裏面的點擊處理程序並返回它?允許我做promise.done()來顯示變量?並跳過第二個Ajax調用 – jc72 2013-02-21 22:07:32

+0

您不應該使用全局變量,而是使用該值明確解決您的承諾。所以你想從點擊處理程序範圍獲得一個值? – Bergi 2013-02-21 22:43:58

+0

是的Bergi,我只是想從點擊處理程序採取id值,並在另一個文件中使用它。 – jc72 2013-02-21 22:47:51

相關問題