0

var imageURL = jQuery.Deferred();据え置きオブジェクトとしてグローバル変数があります。

次に、ループを実行する関数があります。ループごとに、非同期関数を介して生成される値を取得する予定です。私が抱えていた問題は、関数が値を返す前に呼び出されていたため、値を正しく取得できなかったため、jQuerydeferredを使用するように指示されました。私の頭を完全に理解することはできません:

    downloadProductImage: function(remoteImage, localImageName){

    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {
         fileSystem.root.getFile(localImageName, {create: true, exclusive: false}, function ff1(fileEntry) {
         var localPath = fileEntry.fullPath;
         var ft = new FileTransfer();
         ft.download(remoteImage,
              localPath, function (entry) {
                   imageURL.resolve(entry.fullPath);

                    //return entry.fullPath;

                     }, fail);
                   }, fail);
        }, fail);
}

downloadProductImage関数はループで実行され、この関数が呼び出された直後に、imageURL.resolve(entry.fullPath)の値を取得したいので、次のようにしました。

    //start loop
    imageURL.done(function(theURL){
        alert(theURL);
    });
//end loop

これを正しく理解していれば、ファイルのダウンロードからのコールバックが実行され、完了するとimageURL.done()が実行されます。ただし、done()は、それぞれを上書きしているかのように、同じファイルパスを表示し続けます。

どんな助けでもいただければ幸いです。

4

1 に答える 1

0

コメントで述べたように、imageURLをグローバル変数として使用することはできません。$.Deferred一度だけ使用できます。その状態がまたはである場合、追加またはコールバックするたびresolvedに、すぐに同じ結果が返されます。rejected.done.fail

あなたがすべきことは、グローバルなimageURLを削除しdownloadProductImage、新しいを返すようにすること$.Deferredです。.doneこのようにして、返されたにを追加できます$.Deferred

downloadProductImage: function(remoteImage, localImageName) {
    var imageURL = $.Deferred();
    window.requestFileSystem(
        [...]
        ft.download(remoteImage,
            localPath, function (entry) {
                imageURL.resolve(entry.fullPath);
                //return entry.fullPath;
                }, fail);
            }, fail);
    }, fail);
    return imageURL;
}

rejectまた、ファイル転送が失敗した場合は、延期することを忘れないでください。

于 2013-02-12T16:21:21.330 に答える