2016-03-17 158 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); 
}); 

謝謝大家的幫助!