我怎么能在javascript中发表声明“for”等待

时间:2013-04-23 03:16:49

标签: javascript jquery ios cordova jquery-mobile

我有1个应用程序使用手机缺口2.5.0写的ios。 我尝试将服务器中的文件下载到我的应用程序。我需要下载很多文件(84个文件);我用1个循环来下载所有。

但是当我使用“for”语句时,它的循环速度太快并且几乎同时下载所有文件,并且由于超时,某些文件无法下载完成。

所以我希望1个文件下载完成,然后下一个文件开始下载。

我该怎么做?

请帮帮我!我是自卸车......

这是我的代码:

var fileTransfer = new FileTransfer();

for (var i = 0; i < anhup.length; i++) {
    console.log("anhup[" + i + "]: " + anhup[i]);
    fileTransfer.download(
        "http://smartphone.thnt.vn/VietGames/GhepTranhTu/IOS/update/"
                + anhup[i], window.rootFS.fullPath + "/" + anhup[i],
        function(entry) {
            sa = entry.fullPath;
            console.log("download complete: " + entry.fullPath);

        }, function(error) {
            console.log("download error source " + error.source);
            console.log("download error target " + error.target);
            console.log("upload error code" + error.code);
        });
}

3 个答案:

答案 0 :(得分:1)

尝试

function download() {
    var i = 0;

    var fileTransfer = new FileTransfer();

    function doDownload(i) {
        fileTransfer.download(
                "http://smartphone.thnt.vn/VietGames/GhepTranhTu/IOS/update/"
                        + anhup[i], window.rootFS.fullPath + "/" + anhup[i],
                function(entry) {
                    sa = entry.fullPath;
                    console.log("download complete: " + entry.fullPath);

                    if (i < anhup.length - 1) {
                        doDownload(i + 1);
                    }

                }, function(error) {
                    console.log("download error source " + error.source);
                    console.log("download error target " + error.target);
                    console.log("upload error code" + error.code);
                });
    }

    doDownload(0)
}

答案 1 :(得分:1)

创建一个函数并继续调用自身,直到对象为空,就像这样。

function loadFile() {
    // no more to load
    if(!anhup.length)
        return;

    var context = anhup.shift();

    fileTransfer.download(url, function(entry) {
        console.log("download complete: " + entry.fullPath);

        loadFile();
    }, function(error) {
        // ...
    });
}

答案 2 :(得分:0)

你不能用“for”循环来做,你需要在调用'success'回调函数时开始下载下一个文件;最简单的方法是制作'i'全局变量,并像这样重写你的代码(未经过测试!):

var i = 0;
var downloadNext;

var onSuccess = function(entry) {
    sa = entry.fullPath;
    console.log("download complete: " + entry.fullPath);
    i = i + 1;
    if (i < anhup.length) {
       downloadNext();
    }
};

var onFail = function(error) {
        console.log("download error source " + error.source);
        console.log("download error target " + error.target);
        console.log("upload error code" + error.code);
};

downloadNext = function() {
    console.log("anhup[" + i + "]: " + anhup[i]);
    fileTransfer.download(
        "http://smartphone.thnt.vn/VietGames/GhepTranhTu/IOS/update/"
            + anhup[i], window.rootFS.fullPath + "/" + anhup[i], 
         onSuccess,
         onFail
    );
};

// start downloading the first one
downloadNext();