我在AbgularJS服务中有以下功能:
var readFile = function (path, file) {
console.info("Trying to read file with URI: " +path+ " "+file);
$cordovaFile.checkFile(path, file).then(function (success) {
console.log(success);
var deferred = $q.defer();
$cordovaFile.readAsText(path, file)
.then(function (success) {
// success
console.log("Success");
console.log(success);
deferred.resolve(success);
}, function (error) {
console.error(error);
deferred.reject(error);
});
return deferred.promise;
}, function (error) {
console.log(error);
});
}
成功回调中的是文件读取的定义函数。
但我总是在这个地方收到异常消息:
TypeError: Cannot read property 'then' of undefined
但如果我这样做:
$cordovaFile.checkFile(path, file).then(function (success) {
console.log(success);
}, function (error) {
console.log(error);
});
它工作正常。
我想只在文件存在的情况下执行文件读取,但我不知道以正确的方式做到这一点。
通过这种方式调用服务方法:
DeviceSrv.readFile(cordova.file.externalRootDirectory+"/"+APP_CONST.MP3_FOLDER_NAME+"/sounds/", APP_CONST.MP3_FILE_NAME)
.then(function(value){
console.log(value);
var parsedObject = JSON.parse(value);
console.log(parsedObject);
$scope.availableSounds = parsedObject.availableSounds;
$scope.availablePrepreparedSounds = parsedObject.availablePrepreparedSounds;
});
我应该如何更新代码以正确的方式执行代码?
非常感谢您的任何建议。
答案 0 :(得分:0)
由于promises可以链接,你只需返回整个promise,而无需创建deferred。
var readFile = function (path, file) {
console.info("Trying to read file with URI: " +path+ " "+file);
return $cordovaFile.checkFile(path, file).then(function (success) {
return $cordovaFile.readAsText(path, file);
}).then(function (success) {
// success
console.log("Success");
console.log(success);
}).catch(function (error) {
console.error(error);
});
}