Angular JS:异步工厂调用问题

时间:2015-01-29 18:55:16

标签: angularjs asynchronous angular-ui-router factory

我是角色的新手,我正在创建一个简单的应用程序。它在项目之间导航,通过JSON拉入:

http://plnkr.co/edit/FTfa1rcVaf85xTu65oSR?p=preview

我也在使用工厂,我拨打getgetOne等电话,以便在一个地方处理$http,只在数据中调用它尚未取得。

当您在主页上启动时,这一切都正常,但是当您在单个项目页面上启动时,同时调用getgetOne,同时引入重复数据。您可以通过在其自己的窗口中打开Plunker并转到/#/projects/1等网址来测试。

我知道为什么会发生这种情况,我无法弄清楚如何阻止它。

对此有一个简单的解决方法,还是以完全错误的方式解决它?

谢谢你看看。

1 个答案:

答案 0 :(得分:5)

让您的函数通过$q返回promises,而不是原始数据。然后,您就可以使用.then()将它们链接起来,以获得所需的等待时间:

get: function() {
    // Create a deferred object
    var deferred = $q.defer();

    // Do stuff in here
    // ...
    // and depending on the results,
    // call deferred.resolve(data) or deferred.reject(error)

    // Return the promise object
    return deferred.promise;
}

然后,在调用此函数的代码中,您可以:

MyFactory.get().then(function (data) {
    $scope.var = data;
}

这种模式在Angular中很常见,效果很好。

更新了plunkr: here。我改变了模拟服务器请求延迟的方式,这样我就可以轻松解决deferred .success()回调中的$http对象。