javascript - 使用自定义方法扩展 $.Deferred.pipe() ?

标签 javascript jquery asynchronous

我想使用自定义方法扩展 $.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() 。任何建议将不胜感激

最佳答案

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

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 );
});

关于javascript - 使用自定义方法扩展 $.Deferred.pipe() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12466776/

相关文章:

Javascript fromCharCode keyCode

javascript - Node typescript 项目中的 Jest 覆盖总是返回空

javascript - 如何使用 chart.js 在图条上方显示值标签

jquery - CSS - 选择器的使用不正确?

c# - WCF 异步服务器端处理

java - 是否可以将 ORM 与 Vert.x 一起使用?

javascript - 在构造函数angular 2中声明属性

javascript - Tumblr JS/Jquery 无限滚动/Masonry 故障

node.js - 为什么每个内核运行一个 Node.js 进程?

javascript - 从 javascript 数组中的每个单词中查找匹配的字母