0

我有一个全局变量var imageURL = jQuery.Deferred();作为延迟对象。

接下来我有一个通过循环运行的函数,对于每个循环,我打算获取通过异步函数产生的值。我遇到的问题是我无法正确获取值,因为在函数返回它们的值之前调用它们,所以我被告知使用 jQuery deferred。无法完全理解它:

    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只能使用一次。当其状态为resolvedorrejected时,每次添加.doneor.fail回调时,都会立即返回相同的结果。

您应该做的是删除您的全局 imageURL,并downloadProductImage返回一个新的$.Deferred. 这样,您可以将 a 添加.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 回答