将angularjs $ http响应转换为string / JSON

时间:2017-05-07 01:28:03

标签: javascript angularjs

因为我是初学者所以请耐心等待。

所以我有这个工厂$ 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数据吗?如果有,怎么样?

非常感谢。

3 个答案:

答案 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>

这是处理来自工厂或服务的异步调用的正确方法。 希望这能解决你的问题。 :)