2016-11-29 57 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'函数是否返回一个Promise? –

+0

Offtopic,但我建议只用英文编码 – diegoaguilar

回答

0

您确定框架使用承诺吗?这些例子没有显示它。

我会尝试使用回调对象,而不是像这样:

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'不支持开箱即用的Promise,你可以随时[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

是的,的确,在服务的方法中也必须有返回,如果不是,结果永远不会返回。但是,如果他试图在他的** agenda.controller.js **中使用'abrirAgenda'函数作为承诺,那么他必须在控制器中的'abrirAgenda'方法内放置一个'return'在他的问题的引用“TypeError:无法读取属性'那么'未定义在AgendaController.abrirAgenda” – lealceldeiro

+0

以及该服务必须有一个返回和该错误将被抛出尝试使用'agendaService.abrirAgenda()。然后()' – 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创建。