angular.js - angularjs $q promise同步傳參依賴問題
我想大声告诉你
我想大声告诉你 2017-05-15 16:59:02
0
3
977
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

大家讲道理

$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
        });
淡淡烟草味

使用 $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/

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板