AngularJs - 延迟解析对象

时间:2016-02-09 17:48:29

标签: javascript angularjs

我是一个根据http.get调用返回布尔值的函数。

function checkValue (value) {
    var defer = $q.defer();
    var request = $http({
          method: "get",
          url: "someurl"
    });

      request.success(function (data) {
        defer.resolve(data.response);

    });
    return defer.promise;
}

问题是返回值是这样的对象:

d {$$state: Object} $$state: Object status: 1 value: true __proto__: Object __proto__: d

我怎么解决?

3 个答案:

答案 0 :(得分:4)

是的,你的函数正在返回一个Promise对象。 $$ state属性属于promise对象,由Angular在内部使用(由$$前缀建议),因此开发人员使用 Angular不会使用它。更有意思的是,承诺对象有一个"然后"可用于附加在promise被解析时调用的处理程序的方法。当与promise相关的延迟对象得到解决时,Promise会得到解决。

因此,您可以将代码用作

checkValue.then(function (data) {
    // This is called when the XHR response comes in and
    // defer.resolve() is called in the checkValue function.
});

但是,有一个更好的方法。使用承诺链。

这基本上不需要创建新的延迟对象。

function checkValue (value) {
    return $http({
          method: "get",
          url: "someurl"
    }).then(function (data) {
        return data.response;
    });
}

解释有关Promise如何工作的一切可能对于这篇文章来说太过分了。已经完成了awesome works

但是,基本上,$ http已经返回一个承诺。所以你可以使用这个承诺,而不是创建一个新承诺。该函数的最终用法与上面的代码段完全相同。

BTW,.success()处理程序已弃用。所以最好开始在你的应用上使用.then()。

答案 1 :(得分:2)

由于您使用的是Promise,因此需要使用function checkValue (value) { var defer = $q.defer(); var request = $http({ method: "get", url: "someurl" }); request.success(function (data) { defer.resolve(data.response); }); return defer.promise; } var promise = checkValue('Hello World'); promise.then(function(response) { //success console.log(response); }, function(reason) { //failed console.log(reason); }); 回调才能获得响应或错误:

$http's
  

然后(successCallback,errorCallback,notifyCallback) - 无论如何   当承诺已经或将要解决或拒绝时,请拨打一个   成功或错误回调一旦结果异步   是可用的。使用单个参数调用回调:   结果或拒绝原因。另外,通知回调可能是   在之前调用零次或多次以提供进度指示   承诺得到解决或拒绝。

但优化的方法是使用var request = $http({ method: 'GET', url: '/someUrl' }); request.then(function successCallback(response) { // this callback will be called asynchronously // when the response is available }, function errorCallback(response) { // called asynchronously if an error occurs // or server returns response with an error status. }); 内置承诺,而不是创建新的承诺。

console.log($('#notes').text());

答案 2 :(得分:0)

你应该试试这个,

function checkValue (value) {
return $q(resolve, reject) {
$http({
      method: "get",
      url: "someurl"
}).success(function (data) {
    resolve(data.response);
}).then (function (error) {
    reject(error);
});
}
}

这将解析您的数据