Синхронный вызов в Угловом js

Я хочу знать, в действительности есть ли, как реализация синхронных вызовов с angularjs.

Проблема, которая у меня есть, - следующая:

У меня есть два URL1 и URL2. URL1._ в этом первом url то, что я делаю, состоит в том, чтобы получать некую стоимость одних asignaturas и c/u их у него есть код. Этот код будет использован потом в моем URL2, который возвратит мне параллель предмета в зависимости от кода.

В настоящее время то, что я сделал, состоит в том, чтобы использовать обещания в angularjs.

Для первого этого я пробегаю URL1 и получаю Ваш data[i].codigo и в свою очередь он послал это этому в URL2 для того, чтобы я возвратился Ваша соответствующая параллель.... Но только он возвращает тот первой мне posicion[i] и оставшаяся часть не.

Я хотел бы, чтобы они смогли вести меня с этим пожалуйста Спасибо.

Код:

.service('ServParalelos',function($http, $q){
  return {
      getAll: getAll
  }

  function getAll (guid_coe) {
      var defered = $q.defer();
      var promise = defered.promise;

      $http.get('http://carbono.utpl.edu.ec:8080/wscodigosqr/webresources/entidades.qrhorario/horarios_componente?guid_coe='+guid_coe)
          .success(function(data) {
              defered.resolve(data);
          })
          .error(function(err) {
              defered.reject(err)
          });

      return promise;
  }
})

Мой controller

$scope.datosComp=data; //esta variable es el data q obtengo de la URL1
    var Tamanio = $scope.datosComp.length;  
    for ( i=0; i < Tamanio; i++) { //Tamanio es del primer url o servicio
      **$scope.guid_coe** =$scope.datosComp[i].guid_coe;
      ServParalelos.getAll($scope.guid_coe).then(function(data) {
        $scope.datosA = data; //en mi sengundo servicio le paso como parametro guid_coe
      })
    }

Мой HTML

<ion-view view-title="Subjects">
  <ion-content class="fondo">
    <div class="list card">
      <div class="item item-input-inset">
        <label class="item-input-wrapper">
           <h4>
             Welcome
          </h4>
        </label>
      </div>
    </div>
    <div class="list card">
      <ion-list>
        <ion-item type="item-text-wrap" ng-repeat="i in datosComp" href="#/Gtuto/componentes/{{i.nom_coe}}">
          <h3>{{i.nom_coe}}</h3>    
          <h3 ng-repeat="i in InfoComp">{{i.paralelo}}</h3>  
        </ion-item>
      </ion-list>
    </div> 
  </ion-content>
</ion-view>
0
задан 24.02.2016, 02:39
3 ответа

Перед тем, как отвечать твой вопрос я должен упоминать о том, что в ajax - очень плохая идея делать синхронный вызов. То, что известно как синхронный вызов, является вызовом в ajax, что блокирует выполнение javascript до тех пор, пока просьба не возвращается с результатом, что не твой случай и в самом деле объявлено как устаревший. Читает спецификацию XMLHttpRequest в методе open третий параметр async; после того, как кладется в false он такой, как возможно посылать синхронный вызов.

В угловом синхронный вызов не является возможным (все вызовы асинхронные), так как услуга $http то, что он возвращает, так это обещание который resoverá или он будет отрицать в будущем с определенной стоимостью (данные, посланные сервером или ошибкой).

Я заметил кроме того, что ты используешь эту нотацию:

function getAll (guid_coe) {
  var defered = $q.defer();
  var promise = defered.promise;

  $http.get('url')
      .success(function(data) {
          defered.resolve(data);
      })
      .error(function(err) {
          defered.reject(err)
      });

  return promise;
}

Что известно как антиглавный файл обещаний. В Вашем месте ты должен использовать что-то как это:

function getAll (guid_coe) {
  return $http.get('url');
}

Не только проще но ты используешь правильный главный файл. Кроме того методы success и error они устаревшие, в Вашем месте ты должен использовать then с этой формой:

promesa.then(function() {
    // success
}, function() {
    // error
});

Упомянув, в который практики ты не должен впадать, давайте возвращаться в твой пример. Такой он такой, как была бы должна оставаться твоя услуга.

.service('ServParalelos',function($http, $q){
  return {
      getAll: getAll,
      getOne: getOne
  }

  function getAll () {
      return $http.get('url1');
  }

  function getOne(guid_coe) {
      return $http.get('url2' + guid_coe);
  }
})

Используя метод $q.all([/*arreglo u objeto con promesas*/]) ты можешь делать что-то, когда все обещания будут решены, например чтобы показывать все результаты в тот же раз, результат, полученный в then также это договоренность с тем же порядком, в котором ты сделал просьбы

В твоем случае это договоренность просьб а следовательно я рекомендую тебе, что результаты в тебе $scope быть должным сохранять точно в договоренности. Если ты делаешь что-то как это:

// Tus resultados se mostrarán todos de un golpe
ServParalelos.getAll().then(function(response) {
    var promesas = [];
    $scope.datosComp=response.data;
    var Tamanio = $scope.datosComp.length;  
    for (var i=0; i < Tamanio; i++) {
        promesas.push(ServParalelos.getOne($scope.datosComp[i].guid_coe));
    }

    return $q.all(promesas);
}).then(function(resultados) {
    // en resultados esta un arreglo con todos los datos de tus llamadas a url2
    // se lo asignas al scope luego de extraerlos
    for (var i=0; i < Tamanio; i++) {
       $scope.datosComp[i].datosA = resultados[i].data;
    }
}, function(err) {
    // Hacer algo con el error
});

Также ты можешь делать что-то как это:

ServParalelos.getAll().then(function(response) {
    // Tus resultados se muestran a medida que van llegando
    $scope.resultados = [];
    $scope.datosComp=response.data;
    var Tamanio = $scope.datosComp.length;  

    function successCb(resp) {
        $scope.resultados.push(resp.data)
    }

    function errorCb(error) {
        // hacer algo con el error
    }

    for ( i=0; i < Tamanio; i++) {       
        ServParalelos.getOne($scope.datosComp[i].guid_coe).then(successCb, errorCb);      
    }
}, function(err) {
    // Hacer algo con el error
});

С особенностью, которой твои данные могут не появляться в том же порядке, так как невозможно предсказывать порядок асинхронных вызовов а следовательно ты должен писать код следующей формы:

ServParalelos.getAll().then(function(response) {
    // Tus resultados se muestran a medida que van llegando
    $scope.datosComp=response.data;
    var Tamanio = $scope.datosComp.length;  

    function asignaAsignatura(indice) {
        function successCb(resp) {
            $scope.datosComp[indice].datosA = resp.data;
        }

        function errorCb(error) {
            // hacer algo con el error
        }

        ServParalelos.getOne($scope.datosComp[indice].guid_coe).then(successCb, errorCb); 
    }


    for (var i=0; i < Tamanio; i++) {       
        asignaAsignatura(i);   
    }
}, function(err) {
   // Hacer algo con el error
});
2
ответ дан 24.11.2019, 14:49
  • 1
    Но Вы верите в то, что q предмет url1 смог появляться с Вашей соответствующей параллелью url2?? Я ему благодарен заранее за Ваш ответ – Dimoreno 23.02.2016, 21:18
  • 2
    Если он смотрит в конце концов, он сводится к, как ты это хранишь в твоем scope для того, чтобы est и # 233; доступный в твоем виде, у этого нет никакой связи с формой, в которой ты делаешь твои просьбы. Если предметы, которые ты просишь в ней url1, - договоренность, ты можешь использовать м и # 233; совсем map и создавать новую договоренность объектов, которые представляли бы предмет; потом в свойстве, которое ты хотел бы, ты распределяешь ему договоренность с параллелью и только тебе остается повторять с ng-repeat, чтобы показывать данные о твоих предметах. – devconcept 23.02.2016, 22:35
  • 3
    Как кажется, он не вытекает, но я ему благодарен за Ваше время @devconcept – Dimoreno 23.02.2016, 23:47
  • 4
    @DiegoIsraelMoreno Уже actualic и # 233; мой ответ с примером, который ты может функционировать. Имей и # 237; в один согрешите и # 241; или вирус. Я это чувствую из-за недостатка. Не хорошо как est и # 225; s располагая в порядке твои данные в виде, но быть должным это и # 237; чтобы помогать тебе. – devconcept 23.02.2016, 23:49
  • 5
    Готовый я буду обрабатывать информацию, чтобы видеть, как он выходит..... mmmm, Чтобы понимать лучше мою проблему, он не желает q я переместил его мои 2 url?? – Dimoreno 24.02.2016, 00:20

основанный на том, что ты говоришь, я чувствую, что это ответ: http://andyshora.com/promises-angularjs-explained-as-cartoon.html

Драйвер:

    // function somewhere in father-controller.js
    var makePromiseWithSon = function() {
        // This service's function returns a promise, but we'll deal with that shortly
        SonService.getWeather()
            // then() called when son gets back
            .then(function(data) {
                // promise fulfilled
                if (data.forecast==='good') {
                    prepareFishingTrip();
                } else {
                    prepareSundayRoastDinner();
                }
            }, function(error) {
                // promise rejected, could log the error with: console.log('error', error);
                prepareSundayRoastDinner();
            });
    };

Услуга:

 app.factory('SonService', function ($http, $q) {
    return {
        getWeather: function() {
            // the $http API is based on the deferred/promise APIs exposed by the $q service
            // so it returns a promise for us by default
            return $http.get('http://fishing-weather-api.com/sunday/afternoon')
                .then(function(response) {
                    if (typeof response.data === 'object') {
                        return response.data;
                    } else {
                        // invalid response
                        return $q.reject(response.data);
                    }

                }, function(response) {
                    // something went wrong
                    return $q.reject(response.data);
                });
        }
    };
});
0
ответ дан 24.11.2019, 14:49
  • 1
    уже я имею тебе мой код для q более или менее пойми меня – Dimoreno 23.02.2016, 01:05
  • 2
    Мы видим, тем временем podr и # 237; схвати иметь стоимость guid_coe подробно описывать лучше? – fredyfx 23.02.2016, 01:10
  • 3
    16ae1bc4-6e77-00a6-e053-ac10363300a6 это один..... Она url1 давайте говорить, что меня возвращает json с тремя данными и каждому отправление Ваш guid_coe каждая из этих различная его более или менее один пойдите – Dimoreno 23.02.2016, 01:16
  • 4
    в конце концов entend и # 237; который ты имеешь в виду с " Paralelos". я сделаю себе период времени, чтобы давать тебе руку, надеялось смочь печатать тебя что-то в следующие часы. Конечно, и #233; xitos с ionic framework! – fredyfx 23.02.2016, 01:19
  • 5
    Muchisisisiimas graciasss я это продолжу в twitter, чтобы мочь перемещать другой url того, чтобы быть необходим..... – Dimoreno 23.02.2016, 01:24

Он рекомендовал бы, что услуга imlementes этой формы .service ('ServParalelos', function ($http, $q) {return {getAll: getAll, getByGuidCoe: getByGuidCoe}

  function getAll () {
      var defered = $q.defer();

      var url = 'http://carbono.utpl.edu.ec:8080/wscodigosqr/webresources/entidades.qrhorario/horarios_componente';

      $http.get(url)
          .success(function(data) {
              defered.resolve(data);
          })
          .error(function(err) {
              defered.reject(err)
          });

      return defered.promise;
  };

 function getByGuidCoe (guid_coe) {
      var defered = $q.defer();

      var url = 'http://carbono.utpl.edu.ec:8080/wscodigosqr/webresources/entidades.qrhorario/horarios_componente?guid_coe=' + guid_coe;

      $http.get(url)
          .success(function(data) {
              defered.resolve(data);
          })
          .error(function(err) {
              defered.reject(err)
          });

      return defered.promise;
  };

})

Ты Определяешь два метода один getAll() и другой getByGuid() тогда, если ты отделяешь функциональность, перемещая или нет фильтр url.

, призвав это с controller, ты использовал бы

$scope.datosComp = [];
$scope.datosA = [];

ServParalelos.getAll().then(function(data) {

    $scope.datosComp=data; 
    angular.forEach(data, function(value, key) {

          ServParalelos.getByGuidCoe(value.guid_coe).then(function(data) {
            $scope.datosA.push(data); 
          })

        });

});

, Когда ты призываешь во второй метод, ты должен добавлять, что стоимость, которую ты получаешь в array, так как ты получишь больше одного, я именно поэтому определяю scope и использую push()

0
ответ дан 24.11.2019, 14:49
  • 1
    datosComp он имеет ortra url не тот же самый, что..... Я попытаюсь видеть q таково он я идет Спасибо – Dimoreno 23.02.2016, 01:22
  • 2
    но ты не поместил в тот, что ты призываешь услугу с первый url, было понятно, что это был тот же самый перемещая или нет его параметр – Leandro Tuttini 23.02.2016, 01:32
  • 3
    право прощение сейчас я имею carbono.utpl.edu.ec:8080/wscodigosqr/webresources / и hellip; – Dimoreno 23.02.2016, 03:51

Теги

Похожие вопросы