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

解決されたFileEntryオブジェクトをバックグラウンドgetDeferredFileEntry()でカスタムread()に渡す方法に苦労しています。アドバイスをいただければ幸いです

4

2 に答える 2

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

…手動で延期を作成する代わりに。

于 2013-02-26T19:25:28.213 に答える
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 );
});
于 2013-02-26T17:44:03.657 に答える