Angular JS:异步工厂调用问题

Ale*_*ton 3 asynchronous factory angularjs angular-ui-router

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

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

我也在使用工厂,在那里我打电话,get或者getOne,这样它$http在一个地方处理,只有在数据尚未被提取的情况下才调用它.

当你在主页上开始时这一切都很好,但是当你在一个单独的项目页面上开始时,两个get并且同时getOne被调用,拉入重复的数据.您可以通过在其自己的窗口中打开Plunker并转到诸如的URL来测试/#/projects/1.

我知道为什么会这样,我只是无法弄清楚如何阻止它.

有没有一个简单的解决方案或我是否完全错误的方式?

谢谢参观.

Nat*_*ini 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;
}
Run Code Online (Sandbox Code Playgroud)

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

MyFactory.get().then(function (data) {
    $scope.var = data;
}
Run Code Online (Sandbox Code Playgroud)

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

更新了plunkr: 这里.我改变了你模拟服务器请求滞后的方式,以便我可以deferred.success()回调中轻松解决我的对象$http.