使用操作表返回一个promise

时间:2017-01-07 13:52:49

标签: javascript angularjs ionic-framework promise

我正在尝试使用actionsheet(离子)返回一个承诺。

错误:

  

TypeError:无法读取未定义的属性'then'       在CambiarImagenesController.seleccionarImagen(cambiarimagenes.controller.js:33)

这是有问题的功能(控制器):

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

我认为问题在于“seleccionarImagen”函数没有正确地返回承诺。

所以这是“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;
        }
         }


   })
}

像“obtenerImagen”这样的一些方法可以完美地回报诺言。我知道,因为我做了一个poup并且给了我正确的承诺,但现在我需要一个动作表。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您需要自己创建一个承诺,并在获得图像时解决/拒绝它,如下所示:

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

答案 1 :(得分:0)

也许你尝试过这样的事情......你用$ 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;
        }
         }


   })
}