未正确分配本地变量

时间:2016-07-18 11:08:21

标签: javascript cordova scope

我创建了一个使用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之外)变量,但即使这样也没有正确保持其值。

这似乎是一个可变范围问题,但我不知道如何解决它。

2 个答案:

答案 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时代码路径的外观。

  1. 将变量result实例化为false。
  2. 调用window.resolveLocalFileSystemURL(...)并插入一个回调函数,以便在处理完成后调用API。
  3. 注意:在此阶段,您的代码将转到下一行console.log(result)。由于result仍然是假的;在此期间,文件删除仍在进行中。
  4. 最后致电return,无需等待window.resolveLocalFileSystemURL返回。
  5. 要解决这个问题 - 你应该做点像......

    查看:

    (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的原始调用者。