angulaire.js - angulairejs $q promet un problème de dépendance de passage de paramètre synchrone
我想大声告诉你
我想大声告诉你 2017-05-15 16:59:02
0
3
982
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);
        });
        
        
    }]);

Comme indiqué dans le code ci-dessus, j'utilise un délai différé pour deux usines et j'utilise promise pour effectuer un chargement synchrone similaire
Mais il y a maintenant un problème
La méthode query(ids) dans mon documentTagsFactory nécessite un. les paramètres sont passés, et ce paramètre dépend de En m'appuyant sur le résultat de documentListFactory,
Je suis nouveau sur Angularjs, mais je ne sais pas comment l'implémenter ici, j'utilise $q.all pour réaliser plusieurs synchronisations, mais je ne parviens toujours pas à transmettre des paramètres, je me demande. si vous avez des méthodes,
PS : je n'aime vraiment pas

similaire à jquery
$.get(function(){
    $.get(function(){
    })
})

ou

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

Ce genre de nidification.
Ce que je veux, c'est une méthode de type synchronisation et non imbriquée, merci

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

répondre à tous(3)
过去多啦不再A梦

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

大家讲道理

Le résultat renvoyé par l'exécution de $http est une promesse. Qu'est-ce que cela signifie si vous l'encapsulez à nouveau ?

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;
}]);

Ne serait-il pas préférable de l'écrire comme ça

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'
            });
        }
    }
}]);

Je peux comprendre qu'il faut éviter l'enfer des rappels, mais l'utilisation de promise est imbriquée, vous devez donc l'écrire comme ça même si vous ne l'aimez pas ! Si vous souhaitez écrire une synchronisation, utilisez Generetor d'ES6 ou async d'ES7

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

Utilisez la $q.when méthode

(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/

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal