搜尋

首頁  >  問答  >  主體

angular.js - angularjs $q promise同步傳參依賴問題

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(){
    })
})

這種巢狀。
要的是類似同步,並且非嵌套的方法,謝謝

我想大声告诉你我想大声告诉你2843 天前1007

全部回覆(3)我來回復

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-15 17:01:02

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

    回覆
    0
  • 大家讲道理

    大家讲道理2017-05-15 17:01:02

    $http執行回傳的結果就是一個promise,你又封裝一遍這是什麼意思?

    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('documentListFactory',['$http',function($http){
        return $http.get('http://3.cs/index.php?_json=1&_content=1');
    }]);
    
    app.factory('documentTagsFactory', ['$http', function ($http) {
        return {
            query: function (ids) {
                return $http.post('http://3.cs/index.php/tags/assoc-tags', {
                    'id': ids ? ids : [1, 23],
                    'model': 'Document'
                });
            }
        }
    }]);
    

    避免callback hell我可以理解,但是promise的用法就是帶嵌套的,不喜歡也得這樣寫!想寫同步那就用ES6的Generetor或是ES7的async

    documentListFactory
            .success(function (ids) {
                return documentTagsFactory.query(ids);
            })
            .success(function (data) {                
                //todo
            });

    回覆
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-15 17:01:02

    使用 $q.when 方法

    (function () {
        var app = angular.module("myApp", []);
        app.service('noPromise', function() {
            return {
                getResult: function() {
                    return { status: "noPromise" };
                }
            };
        });
        app.service("promise", ['$q', '$timeout', function($q, $timeout) {
            return {
                getResult: function() {
                    var deferral = $q.defer();
                    $timeout(function() {
                        deferral.resolve( { status: "promise" } );
                    }, 1000);
                    return deferral.promise;
                }
            };
        }]);
        app.run(['$rootScope', '$q', 'noPromise', 'promise', 
                 function ($rootScope, $q, noPromise, promise) {
                    $rootScope.status = 'Ready.'; 
                     $q.when(noPromise.getResult()).then(function(result) {
                         $rootScope.status = result.status;
                     });
                     $q.when(promise.getResult()).then(function(result) {
                         $rootScope.status = result.status;
                     });
        }]);
    })();

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

    回覆
    0
  • 取消回覆