【问题标题】:Why am I not getting any data when trying to use the promise returned from my ajax call为什么我在尝试使用从我的 ajax 调用返回的承诺时没有得到任何数据
【发布时间】:2013-02-21 21:21:53
【问题描述】:

我已经尝试了这个论坛和其他论坛的几种解决方案,但似乎没有任何效果。我不确定这是否是一个逻辑问题,根本无法按照我想要的方式完成,或者我只是没有以正确的方式访问返回。

我要做的是列出一组链接(代码在外部文件 Main.js 中),当点击链接时获取 id 并使用它进行第二次 ajax 调用,并且 open 也将打开第二个窗口(代码在外部文件 Cites.js 中),其中包含有关单击的链接的更多信息。

问题是我无法从 Main.js 中的第二个 ajax 调用中获取要在我的 Cites.js 文件中使用的 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);
});

感谢您的帮助

【问题讨论】:

  • 你为什么从点击处理程序返回一个 ajax 承诺?
  • 当我尝试在点击事件之外执行此操作时,我无法获取 id,然后在 ajax 调用中使用它首先查看它是否返回大于 0 的长度。所以我都在里面

标签: javascript jquery


【解决方案1】:

您可以使用 promise = $.ajax(…).then(function(){…}) - 但 then 方法确实为匿名函数的结果创建了一个新的承诺(在旧版本的 jQuery 中这是 pipe) - 另请参阅 pipe() and then() documentation vs reality in jQuery 1.8

但是,由于您没有从 anon 函数返回任何内容,因此您不会在 promise.done() 中收到任何内容。

如果你想做一个链式 ajax->click->ajax->done,你需要手动为 click 处理程序构建一个 promise。

【讨论】:

  • 好的,我可以在点击处理程序中为我的全局变量分配一些东西并返回它吗?允许我做 promise.done() 来显示变量?然后跳过第二个 ajax 调用
  • 您不应使用全局变量,而应使用该值明确解决您的承诺。所以你想从点击处理程序范围中获取一个值?
  • 是的,Bergi,我只想从点击处理程序中获取 id 值并在另一个文件中使用它。
  • 不得不改变问题,因为真正的问题是我似乎无法让 promise 对象在单独的文件中工作。感谢您的所有帮助!
  • 嗯?这是一个完全不同的问题。我认为你应该恢复它并要求一个新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2023-01-25
  • 1970-01-01
相关资源
最近更新 更多