2012-09-17 122 views
3

我想用自定义方法扩展$ .Deferred.pipe,这样我就可以缩短我的延期链了。

我目前拥有的代码是这样

getDeferredFileEntry() 
//returns a ($.Deferred) promise to resolve with a FileEntry object 
    .pipe(function(entry){ 
     //returns a promise to resolve with an object 
     //containing the contents of the file as text 
     //and a reference to the file's FileEntry 
     var def = $.Deferred(); 
     entry.getDeferredText() 
      .done(function(fileText){ 
       def.resolve({text:fileText, fileEntry:entry}); 
      }); 
     return def.promise(); 
    )} 
    .done(function(response){ 
     var text = response.text; 
     var fileEntry = response.fileEntry; 

     console.log(text); 
     //do something with the text 
     console.log(fileEntry); 
     //do something else with the file entry after finished reading from it 
     //e.g. deleting with something like fileEntry.remove(); 
    }); 

我想缩短,要

getDeferredFileEntry() 
    .read(
     //uses the FileEntry object resolved by getDeferredFileEntry 
     //to call an asynchronous fileEntry.read() *in the background* 
     //the contents are then passed to the callback taken from below 
     //returns promise to resolve with the fileEntry object for chaining 
     function callback(text){ 
      //do something with the text 
      console.log(text); 
     } 
    ) 
    .remove(
     function(fileEntry){ 
      //library call to remove fileEntry that read() promised 
     } 
    ) 

我与如何从getDeferredFileEntry()解决FileEntry的对象传递给自定义read()挣扎在背景中。任何意见,将不胜感激

+1

getDeferredFileEntry是如何定义的?它所返回的promise对象将需要修改以添加额外的read方法,否则您将不得不将新的read方法添加到所有promise对象。 –

回答

0

为什么不简单地创建一些辅助方法,抽象出你的管道逻辑?

function getFileEntry() { 
    // Returns a promise resolved when your file entry is available 
} 

function getFileContents(entryPromise) { 
    return entryPromise.pipe(function(entry) { 
    return readFileEntry(entry); 
    }); 
} 

function readFileEntry(entry) { 
    var dfr = $.Deferred(); 

    // do whatever you have to do to read the file 
    // then call dfr.resolve(fileContents); 

    return dfr.promise(); 
} 

function removeFileEntry(entry) { 
    var dfr = $.Deferred(); 

    // do whatever you have to do to remove the file 
    // then call dfr.resolve(); 

    return dfr.promise(); 
} 

使用这些方法,你的代码应该结束这样看:

var fileEntry = getFileEntry(); 

readFileEntry(fileEntry).then(function(contents) { 
    // Do something with your file contents 
    removeFileEntry(fileEntry); 
}); 
0

我不认为自定义方法将有很大的帮助,你仍然需要尊重链接(例如,通过维护一个内部队列)。

在你的情况,嵌套回调是最简单的事情:

getDeferredFileEntry().then(function(entry) { 
    return entry.getDeferredText().then(function(text) { 
    // after finished reading from it: 
     console.log(txt); // do something with the read text 
     console.log(fileEntry); // do something with the file entry 
     return fileEntry.remove(); // e.g. deleting it 
    }); 
}); 

如果您更愿意使用管道解决方案,您可以将其简化为

.pipe(function(entry) { 
    return entry.getDeferredText().pipe(function(fileText) { 
     return {text:fileText, fileEntry:entry}; 
    }); 
}) 

...而不是手动构建Deferreds。