我正在尝试使用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并且给了我正确的承诺,但现在我需要一个动作表。
感谢您的帮助!
答案 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;
}
}
})
}