0

次の状況で遅延を解決しようとすると、いくつかの問題が発生します

services.factory('MyService', ['$q',
 function($q) {
  var Foo = function() {
    var deferred = $q.defer();
    window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
    window.requestFileSystem(window.TEMPORARY, 1024 * 1024, deferred.resolve, this.errorHandler);
    return deferred.promise;
  }

  return {
    Foo: Foo
  }
 }
]);

次に、コントローラー内で:

var bar = new MyService.Foo().then(function(cb) {
  console.log(cb)
});

requestFileSystem 関数の外で deferred.resolve を使用すると、完全に機能しますが、上記の状況では何も起こりません。PS: requestFileSystem 関数の 3 番目のパラメーターは、準備ができたらファイルシステム オブジェクトを取得するコールバックです。

編集:これはバーです:

Object {then: function, catch: function, finally: function}

requestFileSystem の 4 番目のパラメーターは、ファイルシステム API の初期化エラーをコンソールに記録する関数ですが、この場合、requestFileSystem が成功したため呼び出されず、deferred.resolve を呼び出す必要があります。deferred を通常の関数に置き換えると:

 window.requestFileSystem(window.TEMPORARY, 1024 * 1024, function(filesystem){
   console.log(filesystem);
 }, this.errorHandler);

次に、ファイルシステム オブジェクトが正しく返されます。

DOMFileSystem {root: DirectoryEntry, name: "http_127.0.0.1_3000:Temporary"}

EDIT2:

requestFilesystem 関数を独自の関数でシミュレートして簡単なテストを作成しようとしましたが、動作します。

var Foo = function() {
    var deferred = $q.defer();
    asd(deferred.resolve)
    return deferred.promise;
}

function asd(callback) {
    callback('it works')
}

MyService.Foo().then(function(cb){
  console.log(cb)
})
4

2 に答える 2

1

github.com/maciel310/angular-filesystemからのより良い解決策があります

//wrap resolve/reject in an empty $timeout so it happens within the Angular call stack
//easier than .apply() since no scope is needed and doesn't error if already within an apply
function safeResolve(deferral, message) {
    $timeout(function() {
        deferral.resolve(message);
    });
}
function safeReject(deferral, message) {
    $timeout(function() {
        deferral.reject(message);
    });
}
于 2014-07-29T07:02:41.797 に答える