为什么我不能返回$ .ajax结果,但可以返回$ http.post结果?

时间:2016-03-17 08:21:27

标签: javascript jquery angularjs ajax google-chrome

我有2个回复语句:

return $http.post({ 
    url: CHEAPWATCHER.config.domain + 'api/Authenticate',
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
    data: data
});

return $.ajax({
    type: 'POST',
    url: CHEAPWATCHER.config.domain + 'api/Authenticate',
    data: data
}).done(function (result) {
    console.log('logged successfuly');
}).fail(function (result) {
    console.log('loging failed');
});

和我使用API​​方法的background.js函数:

// REGISTER API COMMAND LISTENER
chrome.runtime.onConnect.addListener(function (port) {
    port.onMessage.addListener(function (request, portInfo) {
        // Globally accessible function to execure API calls
        CHEAPWATCHER.executeApiCall = function (request, senderId) {
            var originalRequestMethod = request.method;
            //Dinamically call API method
            CHEAPWATCHER.api[request.method](request, senderId).then(function (response) {
                port.postMessage(response);
            }, function (error) {
                port.postMessage(error);
            });
        };
        CHEAPWATCHER.executeApiCall(request, request.sender);
    });
});

当我正在运行我的chrome扩展时,我会评论其中一个,但重点是它们都返回相同的对象类型jqXHR,如果我使用$ http.post它给了我这些错误:

  

(未知)事件处理程序出错:TypeError:无法读取属性'错误'为null

  

POST chrome-extension:// cmakfpdagfeiefcmmpmhjrtyhonmgnbi / background / [object%20Object] net :: ERR_FILE_NOT_FOUND

当我使用$ .ajax它有效时,我得到了我需要的令牌,但它给了我这个错误:

  

(未知)事件处理程序出错:TypeError:无法读取属性'错误'为null

之后我的分机无法继续工作。昨天我问为什么$ .ajax给了我这个错误,我得到了答案因为我不能返回jqXHR类型,但如果我使用

return $http.post(CHEAPWATCHER.config.domain + 'api/Authenticate', data);

一切都很好,只是post方法想要我给他grant_type =密码和Content-Type application / x-www-form-urlencoded以便这就是我使用$ http.post([settings])结构的原因。

有人可以解释一下它们是如何工作的,以及为什么我会收到这些错误?也许我错误地使用了post方法,或者我需要声明一些我不知道的东西?

2 个答案:

答案 0 :(得分:0)

您未正确使用$http.post。这个方法需要3个参数,而不是像这样的一个对象:

return $http.post(
   CHEAPWATCHER.config.domain + 'api/Authenticate',
   transformDataToUrlEncoded(data),
   {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'}
});

如你所见,我放了一个transformDataToUrlEncoded。由于角度仅在JSON中序列化,因此他不会将javascript对象转换为urlencoded。

来自主题的旧答案

$ http.post返回一个可以使用.then的承诺。 Angular promise是可以接受的,这意味着你可以一次又一次地执行.then()。then()。then(),以便有多层处理结果。当然,你经常不需要这样。我会说几乎从不超过2级:

  1. 处理服务器中的结果并格式化服务层中的数据
  2. 在控制器层中使用结果
  3. 我并不是真的了解JQuery,但我认为它不具有角度可链接性。

    你可能可以做到

    .done().fail()
    

    因为.done返回可以执行.fail()而不是

    的对象
    .done().done(). 
    

    因为.done返回的对象没有.done()方法。

    最后.fail()是终止点:它什么都不返回,所以你返回空值。

答案 1 :(得分:0)

因此经过大量的谷歌和思考后,我来到解决方案,也许有一天它可能对某人有所帮助。 insted $ html.post()和$ .ajax()方法我将我的数据转换为x-www-form-urlencoded为@Walfrat和@TheMadDeveloper建议所以我的代码现在可以完美地运行如下:

return $http({
    method: 'POST',
    url: CHEAPWATCHER.config.domain + 'api/Authenticate',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    transformRequest: function (obj) {
        var str = [];
        for (var p in obj)
            str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
            return str.join("&");
        },
        data: data
    }).success(function (result) {
            console.log(result);
});

谢谢大家的帮助!!!