2013-02-12 1 views
0

У меня есть глобальный var var imageURL = jQuery.Deferred(); как отложенный объект.Использование jQuery отложенных() и разрешать внутри функции, которая находится в цикле

Далее У меня есть функция, которая проходит через цикл, и для каждого цикла я намерен получить значение, которое создается через асинхронную функцию. Проблема была в том, что я не мог правильно получить значения, поскольку они вызывались до того, как функция вернула их значение, поэтому мне сказали использовать jQuery отложенным. совсем не могу получить мою голову вокруг него:

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() продолжает показывать один и тот же путь к файлу, как если бы он переписывал каждый.

Любая помощь будет оценена по достоинству.

+0

Вы пытаетесь решить один и тот же отложенный объект более одного раза? отложенные объекты могут быть разрешены только один раз. –

+0

Да, я делаю это, не понял, что вы можете отложить только один объект. Что было бы подходящим обходным решением? – JamesG

+0

В вашем случае было бы разумнее использовать либо настраиваемое событие, либо объект '$ .Callbacks'. –

ответ

0

Как указано в комментариях, вы не можете использовать imageURL в качестве глобального var. $.Deferred может использоваться только один раз. Когда его состояние было resolved или rejected, каждый раз, когда вы добавите .done или .fail callback, thet немедленно вернется с тем же результатом.

Что вы должны сделать, это удалить свой глобальный 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 ваш отложенный если ваш файл трансферт терпит неудачу.