我已尝试过这个论坛和其他人的几个解决方案,但似乎没有任何效果。我不确定这是否是一个逻辑问题,根本无法按照我喜欢的方式完成,或者我是不是以正确的方式访问返回。
我要做的是列出一组链接(代码在外部文件Main.js中),当点击链接时,取id并使用它进行第二次ajax调用并打开也将打开第二个窗口(代码在外部文件Cites.js中),其中包含有关所点击链接的更多信息。
问题是我无法从Main.js中的第二个ajax调用获取id,以便在我的Cites.js文件中使用。我正在尝试返回第二个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 :(得分:0)
你做promise = $.ajax(…).then(function(){…})
- 但是then
方法确实为匿名函数的结果创建了一个新的承诺(在旧版本的jQuery中这是pipe
) - 另见{{ 3}}
但是,由于您不从anon函数返回任何内容,因此promise.done()
中不会收到任何内容。
如果你想做链ajax-&gt; click-&gt; ajax-&gt; done,你需要手动为点击处理程序建立一个承诺。