从一个工厂查询并使用它来查询另一个工厂

时间:2015-09-01 23:31:45

标签: angularjs

在找到商店后使用此代码我希望angular从商店列表(商店)中获取正确的商店,但我无法确定如何将商店ID输入到商店查询列表中。

app.factory('Stores', function ($resource) {

    return $resource('/rest/stores/:id',{ id: '@id' });

});

app.factory('FindStore', function ($resource) {

    return $resource('/rest/locator/:input',{ input: '@input' });

});

app.controller('baseCtrl', function($scope, $http, Stores, FindStore, $location, $filter) {

    fetchStore($scope.locator);

    var id = $scope.store.id;
    console.log(id); //returns undefined
    $scope.myStore = Stores.query({id:id}); //fetch all the stores instead of one

    function fetchStore(input){

        $scope.store = FindStore.get({input:input});
        var id = $scope.store.id;
        console.log(id); //returns id
    }

});

感谢您的帮助,并提前感谢您

1 个答案:

答案 0 :(得分:0)

$resource函数是异步的,并使用promises来提供结果。所以你需要像这样使用FindStore

FindStore.get({input: input}).$promise.then(function(result){
    // print out the result of the query
    console.log(result);
});

基本上,您的代码在查询返回结果之前尝试打印idFindStore.get并不等待答案,它基本上会说,&#34;嘿,你能不能查询服务器,并在收到结果时运行promise函数。&#34; < / p>

我建议您阅读:https://docs.angularjs.org/api/ng/service/ $ q

编辑:如果你想使用一个查询的结果作为另一个查询的参数,有几种方法,但最简单的解释是只使用第一个promise结果中的结果。例如

FindStore.get({input: input}).$promise.then(function(result){
    // get the store id from the result (this is a guess and depends on how you setup your data
    var id = result.store.id;
    // use the id in the next query
    Stores.query({id: id}).$promise.then(function(storeResult){
        // do something with the store result
        console.log(storeResult);
    });
});

请注意您如何执行一个查询,当它返回结果时,您可以使用它来运行下一个查询。然后,下一个查询成为它自己的promise,它在返回该查询时运行result函数。

现在我已经编写了用于理解目的的示例,但是这不是编写promise的非常好的方法。请阅读它们,并再次阅读它们,因为如果你继续使用js,你将在任何地方使用它们。