![](/img/trans.png)
[英]Ionic 2 - (window as any).resolveLocalFileSystemURL() throwing error
[英]Is Ionic Framework resolveLocalFileSystemURL Asynchronous?
我从我的AngularJS控制器调用一个函数。 当函数完成执行时,我想在函数调用后打印结果。
此代码位于控制器内部,称为on-tap
//count the number of files inside a directory
var count = countDir(cordova.file.dataDirectory +'/Images/');
console.log('Hello ');
console.log('Count of directory '+count);
这是countDir函数。 此函数查找目录中的文件数,然后返回计数
function countDir(path){
var count = 0;
console.log('Counting the files inside '+path);
window.resolveLocalFileSystemURL(path,
function (fileSystem) {
var reader = fileSystem.createReader();
reader.readEntries(
function (entries) {
var i;
for (i=0; i<entries.length; i++) {
console.log('File name ' + entries[i].name + ' added to count');
count++;
}
},
function (err) {
console.log(err);
}
);
}, function (err) {
console.log(err);
}
);
return count;
}
我面临的挑战是,我的调用代码首先打印'Hello'和'Count of directory 0',然后打印countDir中的所有内容。
对countDir()
的调用是否异步? 如果是这样,一旦countDir()
返回结果,我如何确保我的调用代码继续进行。
是的,.resolveLocalFileSystemUrl是异步的; 你可以使用$ q承诺解决你的问题:
function countDir(path){
var deff = $q.defer();
var count = 0;
console.log('Counting the files inside '+path);
window.resolveLocalFileSystemURL(path,
function (fileSystem) {
var reader = fileSystem.createReader();
reader.readEntries(
function (entries) {
var i;
for (i=0; i<entries.length; i++) {
console.log('File name ' + entries[i].name + ' added to count');
count++;
}
deff.resolve(count);
},
function (err) {
console.log(err);
deff.reject(err);
}
);
}, function (err) {
console.log(err);
deff.reject(err);
}
);
return deff.promise;
}
并将其消费为:
var count =0 ;
countDir(cordova.file.dataDirectory +'/Images/')
.then( function(result){ count = result},
function(err){ //handle error }
);
提供给window.resolveLocalFileSystemURL
和reader.readEntries
的匿名函数是异步调用的。 处理此问题的“AngularJS方法”是使用$q
服务来创建并返回一个promise。
function countDirPromise(path){
//create $q.defer object
var q = $q.defer();
var count = 0;
console.log('Counting the files inside '+path);
$window.resolveLocalFileSystemURL(path,
function onUrlSuccess(fileSystem) {
var reader = fileSystem.createReader();
reader.readEntries(
function onReaderSuccess(entries) {
var i;
for (i=0; i<entries.length; i++) {
console.log('File name ' + entries[i].name + ' added to count');
count++;
}
//resolve with count
q.resolve(count);
},
function onReaderError(err) {
console.log(err);
//reject with error
q.reject(err);
}
);
}, function onUrlError(err) {
console.log(err);
//reject with error
q.reject(err);
}
);
//return count promise
return q.promise;
}
如您所见,有四个嵌套函数: onUrlSuccess
, onUrlError
, onReaderSuccess
和onReaderError
。 这些函数是异步调用的。 如果调用onUrlSuccess
和嵌套函数onReaderSuccess
则promise将使用值count
解析。 如果调用onUrlError
函数或onReaderError
函数,则会拒绝承诺错误。
var countPromise = countDirPromise(cordova.file.dataDirectory +'/Images/');
console.log('Hello ');
countPromise.then(function onSuccess(count) {
console.log('Count of directory '+count);
//return to chain data
return count;
}).catch(function onReject(err) {
console.log(err);
//throw to chain rejection
throw err;
}).then(anotherSuccessFn, anotherRejectFn);
提供给双方的功能.then
和.catch
方法由异步调用$q
服务。
有关更多信息,请参阅AngularJS $q
服务API参考 - 延迟API
另一种方法是使用ngCordova $ cordovaFile API返回的$q
服务承诺。
function countDirPromise(path){
var count = 0;
console.log('Counting the files inside '+path);
var promise = $cordovaFile.checkDir(path);
var derivedPromise = promise.then(
function onSuccess(fileSystem) {
var q = $q.defer()
var reader = fileSystem.createReader();
reader.readEntries(
function onReaderSuccess(entries) {
var i;
for (i=0; i<entries.length; i++) {
console.log('File name ' + entries[i].name + ' added to count');
count++;
}
//resolve with count
q.resolve(count);
},
function onReaderError(err) {
console.log(err);
//reject with error
q.reject(err);
}
);
//return to chain promise
return q.promise;
};
});
return derivedPromise;
}
您可以将回调传递给countDir函数,并在for循环后调用它。
var count = countDir(cordova.file.dataDirectory +'/Images/', function(count){
console.log('Hello ');
console.log('Count of directory '+count);
});
并在功能的定义。
function countDir(path, callback){
...
for (i=0; i<entries.length; i++) {
...
}
callback(count);
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.