因为我是初学者所以请耐心等待。
所以我有这个工厂$ 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数据吗?如果有,怎么样?
非常感谢。
答案 0 :(得分: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
能够同步运行,但事实并非如此。
答案 1 :(得分:1)
你的问题是$http返回一个promise对象,这意味着你的pollCodeStatus是一个promise对象。
如果解析了promise对象,则会调用您提供给then
的函数。这一行return i
是您向then
提供的函数的返回。
如果您想获得i
,可以使用全局变量。如下所示:
var i
factory.checkPollCodeIfAvail = function(x){
...
.then(function(response){
i = response.data.message.toString();
});
};
console.log(i);
答案 2 :(得分:0)
$ http用于进行异步调用,$ http返回一个promise对象,需要在访问它之前解析。但是在您的代码中,您已经以同步方式使用它。
您需要在工厂中创建延迟对象并返回此延迟对象。 所以,这是更新的代码:
首先将 $ q 注入工厂。
pollFactory.checkPollCodeIfAvail('qwe123').then(function(resp){
console.log(resp);
});
在你的控制器中,你将解决这个问题:
<div id="mycarousel" class="carousel slide" data-ride="carousel" data-interval="10000">
<ol class="carousel-indicators">
<li data-target="#mycarousel" data-slide-to="0" class="active"></li>
<li data-target="#mycarousel" data-slide-to="1" class=""></li>
<li data-target="#mycarousel" data-slide-to="2" class=""></li>
</ol>
<div class="carousel-inner" role="listbox" style="width:100%; height:100%; border:1px solid gold;">
<div class="item active wraptocenter">
<figure style="border:1px solid green;">
<a href="images/gallery-misc/image1.png" target="_blank"><img src="images/gallery-misc/image1.png" style="border:1px solid red;" alt="Image 1"></a>
<figcaption style="border:1px solid black;">
<h4>Figure Title</h4>
<p>Figure Description (approx 3 Lines) Line 1<br>Line2<br>Line3.</p>
</figcaption>
</figure>
</div>
<div class="item wraptocenter">
<figure style="border:1px solid green;">
<a href="images/gallery-misc/image2.png" target="_blank"><img src="images/gallery-misc/image2.png" style="border:1px solid red;" alt="Image 2"></a>
<figcaption style="border:1px solid black;">
<h4>Figure Title</h4>
<p>Figure Description (approx 3 Lines) Line 1<br>Line2<br>Line3.</p>
</figcaption>
</figure>
</div>
<div class="item wraptocenter">
<figure style="border:1px solid green;">
<a href="images/gallery-misc/image3.png" target="_blank"><img src="images/gallery-misc/image3.png" style="border:1px solid red;" alt="Image 3"></a>
<figcaption style="border:1px solid black;">
<h4>Figure Title</h4>
<p>Figure Description (approx 3 Lines) Line 1<br>Line2<br>Line3.</p>
</figcaption>
</figure>
</div>
</div>
<a class="left carousel-control" href="#mycarousel" role="button" data-slide="prev"><span class="glyphicon glyphicon-chevron-left"></span></a>
<a class="right carousel-control" href="#mycarousel" role="button" data-slide="next"><span class="glyphicon glyphicon-chevron-right"></span></a>
</div>
这是处理来自工厂或服务的异步调用的正确方法。 希望这能解决你的问题。 :)