2016-03-17 162 views
0

我有2个return语句:

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); 
    }); 
}); 

所以ofcourse当我跑步时我的浏览器扩展程序我评论他们中的一个,但问题是,他们都返回相同的对象类型jqXHR,如果我使用$ http.post它给了我这些错误:

Error in event handler for (unknown): TypeError: Cannot read property 'error' of null

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

,当我使用$就它的工作原理,我得到我所需要的令牌,但它给了我这个错误:

Error in event handler for (unknown): TypeError: Cannot read property 'error' of null

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

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

一切都只是罚款POST方法想,我给他grant_type =密码和Content-Type应用程序/ x-www-form-urlencoded,这就是为什么我使用$ http.post([settings])结构。

有人可以请解释我他们如何工作,为什么我得到这些错误?也许我错误地使用了post方法,或者我需要声明更多我不知道的东西?

+0

'$ http'是什么? – Barmar

+0

@Barmar很抱歉忘记提及我正在使用Angular。所以$ http服务是一个核心的Angular服务,通过浏览器的XMLHttpRequest对象或通过JSONP来促进与远程HTTP服务器的通信。 –

+0

您使用的是哪个版本的jQuery? – AhsanAyaz

回答

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回报,你可以使用。然后一个承诺。 Angular promise是可chanable的,这意味着你可以做.then()。然后()。然后()一次又一次地有多层处理结果。当然你不需要经常这样做。我会说几乎从来没有超过2级:

  1. 处理来自服务器和格式的数据结果在服务层
  2. 在控制器层使用结果

我真的不知道JQuery,但我想这是不可链式的角度。

你也许可以做到

.done().fail() 

因为对象.done回报可以在其上执行。失败()但不是

.done().done(). 

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

最后.fail()是终止点:它不返回任何内容,因此您返回空值。


+0

在http://api.jquery.com/jquery.post/#jQuery-post-settings中说有$ http.post的格式,看起来像这样:jQuery.post([settings])和设置是plainObject您可以使用1个plainObject参数@Walfrat –

+0

jQuery承诺也可以链接。正如我从@NikasŽalias的问题所理解的,对于angular和jQuery实现都会发生“TypeError:Can not read property”错误“null”。我怀疑这是发生了什么事情,并且可能有助于在抛出此错误之前弄清代码得到了多少。 – TheMadDeveloper

+0

好吧,我明白了。红色相当不好我编辑我的答案。 – Walfrat

0

所以很多google'ing和思考后,我来到了解决方案,也许有一天它可以帮助别人。的$ html.post()和$阿贾克斯()方法insted的我改变了我的数据X WWW的形式,进行了urlencoded作为@Walfrat和@TheMadDeveloper建议,所以我的代码,现在的作品完美loks这样的:

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); 
}); 

谢谢大家的帮助!