cari

Rumah  >  Soal Jawab  >  teks badan

angular.js - angularjs $q menjanjikan parameter segerak yang melepasi masalah pergantungan

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

Seperti yang ditunjukkan dalam kod di atas, saya menggunakan kelewatan tertunda untuk dua facotry, dan menggunakan promise untuk melakukan pemuatan segerak yang serupa
Tetapi kini terdapat masalah
Pertanyaan kaedah (id) dalam documentTagsFactory saya memerlukan. parameter diluluskan, dan parameter ini bergantung pada Bergantung pada hasil documentListFactory,
Saya baru menggunakan angularjs, tetapi saya tidak tahu bagaimana untuk melaksanakannya di sini Menggunakan $q.all memang mencapai pelbagai penyegerakan, tetapi saya masih tidak boleh lulus parameter anda mempunyai sebarang kaedah,
PS: Saya sangat tidak suka

serupa dengan jquery
$.get(function(){
    $.get(function(){
    })
})

atau

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

Bersarang jenis ini.
Apa yang saya mahukan ialah kaedah seperti penyegerakan dan tidak bersarang, terima kasih

我想大声告诉你我想大声告诉你2843 hari yang lalu1011

membalas semua(3)saya akan balas

  • 过去多啦不再A梦

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

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

    balas
    0
  • 大家讲道理

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

    Hasil yang dikembalikan oleh pelaksanaan $http adalah janji. Apakah maksudnya jika anda merangkumnya semula?

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

    Bukankah lebih baik jika anda menulisnya seperti ini

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

    Saya boleh faham mengelakkan panggilan balik neraka, tetapi penggunaan janji bersarang, jadi anda perlu menulisnya seperti ini walaupun anda tidak menyukainya! Jika anda ingin menulis penyegerakan, gunakan Generetor ES6 atau async ES7

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

    balas
    0
  • 淡淡烟草味

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

    Gunakan kaedah $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/

    balas
    0
  • Batalbalas