我有以下内容:
function wikiAjax (searchURL) {
return Promise.resolve($.ajax({
url: searchURL,
jsonp: "callback",
dataType: 'jsonp',
xhrFields: {
withCredentials: true
},
}));
}
$(".search-form").submit(function() {
var searchText = $('#search').val();
var searchURL = "https://en.wikipedia.org/w/api.php?format=json&action=query&generator=search&gsrsearch=" + searchText + "&gsrlimit=15&prop=extracts&exsentences=3&exintro=&explaintext&exlimit=max&callback=JSON_CALLBACK";
console.log(searchURL);
var wikiResponse = wikiAjax(searchURL);
wikiResponse.then(function(data) {
alert(data);
}, function() {
alert("The call has been rejected");
});
});
但是只有在某个地方放置断点(例如wikiResponse.then
行),我才能得到答案。
然后看起来代码在调用返回结果之前执行但为什么?承诺设置不正确吗?
非常感谢提前。
答案 0 :(得分:4)
我认为这里可能发生的事情是除了ajax调用之外,浏览器还在表单上执行默认的提交事件。结果是窗口被卸载并重新加载。
尝试推杆:
event.preventDefault();
处理程序中的。
$(".search-form").submit(function(event) {
event.preventDefault();
var searchText = $('#search').val();
var searchURL = "https://en.wikipedia.org/w/api.php?format=json&action=query&generator=search&gsrsearch=" + searchText + "&gsrlimit=15&prop=extracts&exsentences=3&exintro=&explaintext&exlimit=max&callback=JSON_CALLBACK";
console.log(searchURL);
var wikiResponse = wikiAjax(searchURL);
wikiResponse.then(function(data) {
alert(data);
},
function() {
alert("The call has been rejected");
}
);
});
答案 1 :(得分:0)
这里不需要做Promise.resolve,因为$ .ajax调用已经返回了一个promise。 试试这个:
function wikiAjax (searchURL) {
return $.ajax({
url: searchURL,
jsonp: "callback",
dataType: 'jsonp',
xhrFields: {
withCredentials: true
}
});
}
$(".search-form").submit(function() {
var searchText = $('#search').val();
var searchURL = "https://en.wikipedia.org/w/api.php?format=json&action=query&generator=search&gsrsearch=" + searchText + "&gsrlimit=15&prop=extracts&exsentences=3&exintro=&explaintext&exlimit=max&callback=JSON_CALLBACK";
console.log(searchURL);
var wikiResponse = wikiAjax(searchURL);
wikiResponse.done(function(data) {
alert(data);
}).fail(function(err) {
alert("The call has been rejected");
});
});
这是一个工作(并修改为显示)plunker:https://plnkr.co/edit/qyc4Tu1waQO6EspomMYL?p=preview
答案 2 :(得分:0)
我认为Promise.resolve()是一个ES6功能,所以除非你明确确定支持它,否则它应该不起作用。
但是,幸运的是你$ .ajax()以下列格式返回一个承诺:
var promise = $.ajax({
url: "/myServerScript"
});
promise.done(mySuccessFunction);
promise.fail(myErrorFunction);
(而不是在你的代码中写入then()和catch())