为什么我没有得到任何数据时,试图使用从我的ajax呼叫返回的承诺

问题描述:

我试过这个论坛和其他人的几个解决方案,但似乎没有任何工作。我不确定这是否是一个逻辑问题,只是不能按照我想要的方式完成,或者我只是没有以正确的方式访问回报。为什么我没有得到任何数据时,试图使用从我的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

你做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