2017-05-07 187 views
0

請耐心等待,因爲我是初學者。

所以我有這個工廠$ HTTP請求到服務器

$ HTTP請求

factory.checkPollCodeIfAvail = function(x){ 
    code = x; 
    return $http({ 
     method: 'POST', 
     data: { 
      'action' : 'checkPollCode', 
      'pollCode' : code 
     }, 
     url: 'http://localhost/poll/api.php', 
     transformRequest:function(obj) { 
      //transform header query into 'myVar1=var1Value&myVar2=var2Value' 
      var str=[]; 
      for(var p in obj){ 
       str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])) 
      } 
      console.log(str.join("&")); 
      return str.join("&"); 
     }, 
     headers:{'Content-Type':'application/x-www-form-urlencoded'} 
    }).then(function(response){ 
     var i = response.data.message.toString(); 
     console.log(i); 
     return i; 
    }); 
}; 

這將理應回到i我的控制器:

控制器:

pollCodeStatus = pollFactory.checkPollCodeIfAvail('qwe123'); 
console.log(pollCodeStatus.toString()); 

當我嘗試console.log i$http request我會得到一個值字符串,但是當我嘗試在controller console.log我將得到的是一個對象[object Object]

那麼我可以將$ http對象轉換爲字符串甚至是json數據嗎?如果是的話,怎麼樣?

非常感謝。

回答

1
factory.checkPollCodeIfAvail = function(x){ 
    code = x; 
    return $http({ 

checkPollCodeIfAvail功能沒有返回i,它返回一個Promise,最終將解析爲i。這是什麼意思? HTTP調用是異步,所以你需要等待,直到它完成。

所以,爲了捕捉i控制器,你需要這樣做:

pollFactory.checkPollCodeIfAvail('qwe123') 
.then(function (pollCodeStatus) { 
    console.log(pollCodeStatus) 
}) 

現在,你已經寫了吧...

pollCodeStatus = pollFactory.checkPollCodeIfAvail('qwe123'); 
console.log(pollCodeStatus.toString()); 

...你有點期待checkPollCodeIfAvail同步運行,情況並非如此。

+0

我看到這更容易理解。非常感謝你! –

1

你的問題是$http返回一個承諾對象,這意味着你的pollCodeStatus是一個promise對象。

如果承諾對象已解決,您將提供給then的函數將被調用。此行return i是您提供給then的功能的返回。

如果你想得到i,你可以使用一個全局變量。如下所示:

var i 
factory.checkPollCodeIfAvail = function(x){ 
... 
.then(function(response){ 
    i = response.data.message.toString(); 
}); 
}; 
console.log(i); 
+0

非常感謝!你的答案几乎與下面的答案相同。謝謝你! –

+0

@ZyxSun ahhh晚上幾秒鐘很高興幫助 –

0

$ http用於進行異步調用,$ http返回需要在訪問之前解析的promise對象。但是在你的代碼中,你已經以同步的方式使用它。

您需要在工廠中創建延遲對象並返回此延遲對象。 所以,這裏是更新的代碼:

進樣$ Q進廠第一。

factory.checkPollCodeIfAvail = function(x){ 
    code = x; 
    var defered = $q.defer(); 
    return $http({ 
     method: 'POST', 
     data: { 
      'action' : 'checkPollCode', 
      'pollCode' : code 
     }, 
     url: 'http://localhost/poll/api.php', 
     transformRequest:function(obj) { 
      //transform header query into 'myVar1=var1Value&myVar2=var2Value' 
      var str=[]; 
      for(var p in obj){ 
       str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])) 
      } 
      console.log(str.join("&")); 
      return str.join("&"); 
     }, 
     headers:{'Content-Type':'application/x-www-form-urlencoded'} 
    }).then(function(response){ 
     defered.resolve(response.data.message.toString()); 
     var i = response.data.message.toString(); 
     console.log(i); 
     return i; 
    }); 
    return defered.promise; 
}; 

而在你的控制器,你可以解決這樣的:

pollFactory.checkPollCodeIfAvail('qwe123').then(function(resp){ 
console.log(resp); 
}); 

這是處理來自工廠或服務異步調用的正確方法。 希望這可以解決您的問題。 :)