次の状況で遅延を解決しようとすると、いくつかの問題が発生します
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)
})