Javascript响应和ajax请求

时间:2016-04-04 14:10:40

标签: javascript jquery ajax promise es6-promise

我有以下内容:

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行),我才能得到答案。

然后看起来代码在调用返回结果之前执行但为什么?承诺设置不正确吗?

非常感谢提前。

3 个答案:

答案 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())