我创建了一个使用cordova-plugin-file插件删除指定目录的函数。函数本身正常工作并删除目录,但我试图根据结果返回成功或失败结果,并完全卡住。
(function() {
var app = {
...
function removeDirectory(path) {
var result = false;
window.resolveLocalFileSystemURL(path, function(dir, status) {
dir.removeRecursively(function(dir, status) { // Success callback
result = true;
console.log(result); // true
}, function(error) { // Failure callback
console.log('Error removing directory: ' + getFileError(error.code));
});
console.log(result); // false
});
console.log(result); // false
return result;
}
}
})();
resolveLocalFileSystemURL()
和removeRecursively()
都不会返回值。
无论我尝试什么,result
总是最终成为false
。我甚至尝试使用全局(IIFE之外)变量,但即使这样也没有正确保持其值。
这似乎是一个可变范围问题,但我不知道如何解决它。
答案 0 :(得分:0)
AJAX中的A代表异步。这意味着从简单的执行步骤中取出发送请求(或者更确切地说是接收响应)。在这个例子中,.send立即返回,并且在你传递的函数甚至被调用之前执行下一个语句return result;。
这意味着当您返回时,您定义的侦听器尚未执行,这意味着您返回的值尚未定义。
function onComplete(a){ // When the code completes, do this
alert(a);
}
function getFive(whenDone){
var a;
setTimeout(function(){
a=5;
whenDone(a);
},10);
}
document.body.innerHTML = getFive(onComplete);
//就像基于更改代码的上述功能一样。
答案 1 :(得分:0)
window.resolveLocalFileSystemURL
是一个异步函数。也就是说,在继续进行之前,代码不会等待return
。
因此,这基本上是在调用removeDirectory
时代码路径的外观。
result
实例化为false。window.resolveLocalFileSystemURL(...)
并插入一个回调函数,以便在处理完成后调用API。console.log(result)
。由于result
仍然是假的;在此期间,文件删除仍在进行中。return
,无需等待window.resolveLocalFileSystemURL
返回。要解决这个问题 - 你应该做点像......
查看:强>
(function() {
var app = {
function removeDirectory(path, done) {
var result = false;
window.resolveLocalFileSystemURL(path, function(dir, status) {
dir.removeRecursively(function(dir, status) { // Success callback
result = true;
console.log(result); // true
return done(null, result); // Success, return.
}, function(error) { // Failure callback
console.log('Error removing directory: ' + getFileError(error.code));
return done(error, result); // oops failed!
});
});
}
}
})();
基本上你在这里做的是让removeDirectory
接受一个done
参数,这将是一个回调函数。因此,当dir.removeRecurisvely
完成其工作时,它可以使用回调函数将响应返回给removeDirectory
的原始调用者。