0

iOS用に作成された電話ギャップ2.5.0を使用するアプリが1つあります。サーバー内のファイルをアプリにダウンロードしようとしています。大量のファイル (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);
        });
}
4

3 に答える 3

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)
}
于 2013-04-23T03:22:41.033 に答える
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) {
        // ...
    });
}
于 2013-04-23T03:25:21.773 に答える
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();
于 2013-04-23T03:29:43.950 に答える