2016-11-29 8 views
0

Я хочу вызвать функцию в моем сервисе. Проблема в том, что после выбора действительной даты мне нужно вернуть дату.Не удается вернуть обещание правильно

Обещание никогда не называется, потому что я думаю, что вернусь неправильно. Можете ли вы помочь мне решить мою проблему?

Это ошибка:

TypeError: Cannot read property 'then' of undefined at AgendaController.abrirAgenda

agenda.controller.js

function abrirAgenda() { 
     var fechaLimite = new Date(vm.agendaComplejo.anioHoy, vm.agendaComplejo.mesHoy - 1, vm.agendaComplejo.diaHoy); 
     fechaLimite.setDate(fechaLimite.getDate() + 30); 
     var fechaSeleccionada = new Date(vm.agendaComplejo.anioSeleccionado, vm.agendaComplejo.mesSeleccionado - 1, vm.agendaComplejo.diaSeleccionado); 
     agendaService.abrirAgenda(fechaSeleccionada, fechaLimite) 
      .then(prueba); 
    } 

//prueba 
    function prueba(resultado){ 
     debugger; 
    } 

agenda.service.js

// abrir la agenda para cambiar de día/mes 
    function abrirAgenda(fechaSeleccionada, fechaLimite) { 
     debugger; 
     var ipObj1 = { 
      callback: function (val) { //Mandatory 
       var fecha = new Date(val); 
       var dia = fecha.getDate(); 
       var mes = fecha.getMonth() + 1; //Se suma 1 porque el primer mez comienza en 0 
       var anio = fecha.getFullYear(); 
       var fechaDeseada = anio + "-" + mes + "-" + dia; 
       return fechaDeseada; 
      }, 
      inputDate: fechaSeleccionada, 
      //inputDate: new Date(), 
      titleLabel: 'Seleccione una fecha', 
      setLabel: 'Aceptar', 
      todayLabel: 'Hoy', 
      closeLabel: 'Cancelar', 
      mondayFirst: true, 
      from: new Date(2016, 2, 1), 
      to: fechaLimite, 
      weeksList: ["D", "L", "M", "MIE", "J", "V", "S"], 
      monthsList: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"], 
      templateType: 'popup', 
      showTodayButton: false, 
      dateFormat: 'dd MMMM yyyy', 
      closeOnSelect: false 
     }; 
     ionicDatePicker.openDatePicker(ipObj1); 
    } 

Мне нужно вернуть выбранный дата: "fechaDeseada". Я пытаюсь использовать ionic datepicker.

Спасибо за помощь!

+1

'abrirAgenda' ничего не возвращает, поэтому он возвращает' undefined', следовательно, ошибку. В коде вообще нет никаких намеков на какие-либо обещания. Функция 'ionicDatePicker.openDatePicker' возвращает обещание? –

+0

Оффтопик, но я советую кодировать только на английском языке – diegoaguilar

ответ

0

Вы уверены, что Framework использует обещания? Примеры этого не показывают.

Я бы попробовать использовать объект обратного вызова, а не, как это:

agenda.controller.js

function abrirAgenda() { 
    //... 

    agendaService.abrirAgenda(fechaSeleccionada, fechaLimite, function(val){ 
      var fecha = new Date(val); 
      var dia = fecha.getDate(); 
      var mes = fecha.getMonth() + 1; //Se suma 1 porque el primer mez comienza en 0 
      var anio = fecha.getFullYear(); 
      var fechaDeseada = anio + "-" + mes + "-" + dia;    
      prueba(fechaDeseada) 
    }) 
} 

agenda.service.js

function abrirAgenda(fechaSeleccionada, fechaLimite, callback) { 
    debugger; 
    var ipObj1 = { 
     callback: callback, 
     //... 
    }; 
    ionicDatePicker.openDatePicker(ipObj1); 
} 
+0

Отличный ответ. Я допустил ошибку. Это не обещание. Мне нужно использовать обратный вызов. Благодаря! –

+0

@FederickJons Нет необходимости использовать обратные вызовы. Вы должны использовать обещания. Если 'openDatePicker' не поддерживает обещания из коробки, вы всегда можете [promisify] (http://stackoverflow.com/q/22519784/1048572). – Bergi

-1

Отредактировано как предложение @charlietfl, хотя есть acc epted ответить

В вашем agenda.controller.js, в случае, когда agendaService.abrirAgenda возвращает обещание, вы должны добавить оператор возврата, как приведенный ниже код. Если agendaService.abrirAgenda не возвращает обещание, вы никогда не получите обещание от ваших agendaService.abrirAgenda

agenda.controller.js

function abrirAgenda() { 
    var fechaLimite = new Date(vm.agendaComplejo.anioHoy, vm.agendaComplejo.mesHoy - 1, vm.agendaComplejo.diaHoy); 
    fechaLimite.setDate(fechaLimite.getDate() + 30); 
    var fechaSeleccionada = new Date(vm.agendaComplejo.anioSeleccionado, vm.agendaComplejo.mesSeleccionado - 1, vm.agendaComplejo.diaSeleccionado); 
    //RETURN here! 
    return agendaService.abrirAgenda(fechaSeleccionada, fechaLimite); 
} 

agenda.service.js

function abrirAgenda(fechaSeleccionada, fechaLimite) { 
     debugger; 
     var ipObj1 = { 
     //... 
     }; 
     return ionicDatePicker.openDatePicker(ipObj1); //if your framwork doesn't return a promise you will get the same error! 
    } 
+1

'return' действительно будет идти по методу службы, а не по методу контроллера! – Hylianpuffball

+0

Да, действительно, в методе службы также должно быть возвращено, если результат не будет возвращен. Но если он пытается использовать функцию 'abrirAgenda' в своей ** повестке дня.controller.js ** в качестве обещания, он также должен поставить' return' также внутри метода abrirAgenda в контроллере, поскольку он заявляет в текстовой форме в цитате своего вопроса «TypeError: Can not read property» then «undefined at AgendaController.abrirAgenda» – lealceldeiro

+0

хорошо, что служба должна иметь возврат, и эта ошибка в настоящее время будет пытаться использовать 'AgendaService.abrirAgenda(). then()' – charlietfl

0

К вернуть обещание от API, который не возвращает обещаний, используйте AngularJS $q Service:

app.service("agendaService", function($q) { 
    this.abrirAgenda = abrirAgenda; 

    function abrirAgenda(fechaSeleccionada, fechaLimite) { 
     //debugger; 
     var qFuture = $q.defer(); 
     var ipObj1 = { 
      callback: function (val) { //Mandatory 
       var fechaDeseada = anio + "-" + mes + "-" + dia; 
       //... 
       //return fechaDeseada; 
       qFuture.resolve(fechaDeseada); 
      }, 
      //... 
     }; 
     ionicDatePicker.openDatePicker(ipObj1); 
     return qFuture.promise; 
    } 
}); 

В приведенном выше примере, когда метод Ionic openDatePicker вызывает обратный вызов, он разрешает обещание, созданное $q.defer.

Применение:

agendaService.abrirAgenda(fechaSeleccionada, fechaLimite) 
    .then(prueba); 

//prueba 
function prueba(resultado){ 
    debugger; 
}; 

Примечание: Это относится только к API, которые не возвращают обещаний.Услуги, такие как $http, $timeout, ngResource, AngularFire и т. Д. Уже возвращение обещание. В этих случаях нет необходимости производить обещание с $q.defer. Производные обещания могут быть созданы просто Chaining Promises.

Смежные вопросы