1

I'm trying to return a promise with actionsheet (ionic).

Error:

TypeError: Cannot read property 'then' of undefined at CambiarImagenesController.seleccionarImagen (cambiarimagenes.controller.js:33)

This is the function that has the problem (controller):

  function seleccionarImagen() {
        cambiarImagenesService.seleccionarImagen() //line 33
            .then(reemplazarImagen);

I think the problem is that the function "seleccionarImagen" is not returning correctly the promise.

So this is the function "seleccionarImagen"

function seleccionarImagen(){
    console.log("paso 1");
    // Show the action sheet
    $ionicActionSheet.show({
     buttons: [
       { text: 'Cámara' },
       { text: 'Galería' }
     ],
     cancelText: 'Cancelar',
     cancel: function() {
          // add cancel code..
        },
     buttonClicked: function(index) {
         if(index == 0){
             var promise = obtenerImagen(Camera.PictureSourceType.CAMERA)
                .then(function(val){
                    // asignamos el valor asincrónico
                    urlImagen = val;
                    // retornamos el valor a la cadena
                    return val;
                });
                // retornamos la promesa de manera síncrona
                return promise;
     }
         else if(index == 1){
       var promise = obtenerImagen(Camera.PictureSourceType.PHOTOLIBRARY)
                .then(function(val){
                    // asignamos el valor asincrónico
                    urlImagen = val;
                    // retornamos el valor a la cadena
                    return val;
                });
                // retornamos la promesa de manera síncrona
                return promise;
        }
         }


   })
}

The are a few methods like "obtenerImagen" thats return the promise perfect. I know that because I made a poup and returned me the promise right, but now I need an actionsheet.

Thanks for help!

Faustino Gagneten
  • 2,564
  • 2
  • 28
  • 54

2 Answers2

0

You need to create a promise yourself and resolve/reject it when an image is obtained, something like this:

function seleccionarImagen() {
    return new Promise(function (resolve, reject) {
        $ionicActionSheet.show({
            buttons: [
                {text: 'Cámara'},
                {text: 'Galería'}
            ],
            cancelText: 'Cancelar',
            cancel: function () {
                reject();
            },
            buttonClicked: function (index) {
                if (index == 0) {
                    obtenerImagen(Camera.PictureSourceType.CAMERA)
                        .then(function (val) {
                            // asignamos el valor asincrónico
                            urlImagen = val;
                            // retornamos el valor a la cadena
                            resolve(val);
                        });
                }
                else if (index == 1) {
                    obtenerImagen(Camera.PictureSourceType.PHOTOLIBRARY)
                        .then(function (val) {
                            // asignamos el valor asincrónico
                            urlImagen = val;
                            // retornamos el valor a la cadena
                            resolve(val);
                        });
                }
            }
        })
    });
}
Max Koretskyi
  • 101,079
  • 60
  • 333
  • 488
0

maybe have you tried with something like this .. where you manage the promise with $q? :

function seleccionarImagen(){
    console.log("paso 1");
    // Show the action sheet
    $ionicActionSheet.show({
     buttons: [
       { text: 'Cámara' },
       { text: 'Galería' }
     ],
     cancelText: 'Cancelar',
     cancel: function() {
          // add cancel code..
        },
     buttonClicked: function(index) {
     var deferred = $q.defer();

         if(index == 0){
             var promise = obtenerImagen(Camera.PictureSourceType.CAMERA)
                .then(function(val){
                    // asignamos el valor asincrónico
                    urlImagen = val;
                    deferred.resolve(val);
                    // retornamos el valor a la cadena
                    //return val;
                }).catch(function(err){
                 deferred.reject(err);
                });
                // retornamos la promesa de manera síncrona
                return deferred.promise;
     }
         else if(index == 1){
       var promise = obtenerImagen(Camera.PictureSourceType.PHOTOLIBRARY)
                .then(function(val){
                    // asignamos el valor asincrónico
                    urlImagen = val;
                    // retornamos el valor a la cadena
                            deferred.resolve(val);
                    //return val;
                }).catch(function(err){
                 deferred.reject(err);
                });
                // retornamos la promesa de manera síncrona
                return deferred.promise;
        }
         }


   })
}
federico scamuzzi
  • 3,708
  • 1
  • 17
  • 24