等待数据,直到回调完成

时间:2014-09-16 10:07:08

标签: javascript angularjs

关于问题Passing data between controllers in Angular JS?我遇到了我的ProductService正在执行某些$ http(RestFUL服务)并返回NULL的情况,因为回调函数没有完成。

因为评估了p.getProducts()函数并且从RestFUL服务获取数据的回调函数是不完整的,所以函数返回始终为null。

app.service('productService', function() {
    p = this
    p.productList = [];

    var addProduct = function(newObj) {
        productList.push(newObj);
    }

    p.getProducts = function(){
        return $http(RestFUL Service,function(data){p.productList.push(data)});
    }

    return {
        addProduct: addProduct,
        getProducts: return p.getProducts();
    };

});

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

你必须玩回调。 http是异步操作,因此您无法立即返回有效结果。如何调用getProducts必须将一个函数(回调)设置为参数,该函数将在http完成时调用 - 当数据可用时。

app.service('productService', function() {
p = this
p.productList = [];

var addProduct = function(newObj) {
  productList.push(newObj);
}

p.getProducts = function(callback){
  $http(RestFUL Service,function(data){
    p.productList.push(data)
    callback(data);//do something with data
  });
}

return {
addProduct: addProduct,
getProducts: p.getProducts
};
}

//invoking
getProducts(function(products){
    //do something with products
});

答案 1 :(得分:0)

如果您将服务更改为更像

return {
  addProduct: addProduct,
  getProducts: p.getProducts
}

然后在控制器中你可以让它像那样工作

app.controller('myCtrl', function ($scope, productService) {
  var products = null

  productService.getProducts().then(function(response){
    //do something with data returned
  })
})

你的getProducts返回$ http,它本身会返回promise,这就是我在控制器中使用then的原因