angular.js - angularjs $q promise同步传参依赖问题
我想大声告诉你
我想大声告诉你 2017-05-15 16:59:02
0
3
970
app.factory('documentListFactory',['$http','$q',function($http,$q){
        //申明一个延迟
        var deferred = $q.defer();
        $http.get('http://3.cs/index.php?_json=1&_content=1').success(function(response){
            deferred.resolve(response);
        }).error(function(response){
            deferred.reject(response);
        });
        // 返回承诺,这里并不是最终数据,而是访问最终数据的API 
        return deferred.promise;   
    }]);

app.factory('documentTagsFactory',['$http','$q',function($http,$q){
        //申明一个延迟
        return {
            query(ids)
            {
                var deferred = $q.defer();
                $http.post('http://3.cs/index.php/tags/assoc-tags',{
                    'id':ids ? ids : [1,23],
                    'model':'Document'
                }).success(function(response){
                    deferred.resolve(response);
                }).error(function(response){
                    deferred.reject(response);
                });
                return deferred.promise;
            }
        }
    }]);

app.controller('listController',['$scope','$http','$q','documentListFactory','documentTagsFactory',function($scope,$http,$q,documentListFactory,documentTagsFactory){
        
        var documentList = {};
        
        /*
            code.....
        */
        //var promise = $q.all([documentListFactory,documentTagsFactory.query(documentListFactory)]);
        
        promise.then(function(data){
        //console.log(data);
            //console.log(documentList);
            //console.log(3);
        });
        
        
    }]);

如上代码,有两个Facotry我都是用deferred延迟,使用promise来进行类似于同步加载的,
但现在有个问题
我documentTagsFactory里面的方法query(ids)是需要一个参数进行传递的,而这个参数依赖于documentListFactory的结果,
angularjs新手,这里我却不知道怎样实现了,使用$q.all确实实现的多个同步,但是却还是没办法传递参数,不知大家有什么方法,
PS:本人非常不喜欢类似于jquery里面的

$.get(function(){
    $.get(function(){
    })
})

promise.then(function(){
    promise2.then(function(){
    })
})

这种嵌套。
要的是类似于同步,并且非嵌套的方法,谢谢

我想大声告诉你
我想大声告诉你

全員に返信(3)
过去多啦不再A梦

http://stackoverflow.com/questions/24402911/abort-angularjs-http-request-deeply-nested-in-multiple-service-calls

いいねを押す +0
大家讲道理

$http の実行によって返される結果は Promise です。これを再度カプセル化すると、どういう意味になりますか?

リーリー

これだけ書いたら終わっちゃうかな

リーリー

コールバック地獄を避けるのはわかるけど、Promiseの使い方が入れ子になっているので、嫌でもこう書かないといけない!同期を書きたい場合は、ES6のGeneretorまたはES7のasyncを使用してください

リーリー
いいねを押す +0
淡淡烟草味

$q.whenメソッドを使用する

リーリー

http://jsfiddle.net/hjzheng/nd1wfkj3/

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート