recherche

Maison  >  Questions et réponses  >  le corps du texte

angulaire.js - angulairejs $q promet un problème de dépendance de passage de paramètre synchrone

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

我想大声告诉你我想大声告诉你2843 Il y a quelques jours1010

répondre à tous(3)je répondrai

  • 过去多啦不再A梦

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

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

    répondre
    0
  • 大家讲道理

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

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

    répondre
    0
  • 淡淡烟草味

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

    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/

    répondre
    0
  • Annulerrépondre