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 函数的第三个参数是一个回调,它一旦准备好就获取一个文件系统对象。

编辑:这是酒吧:

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

requestFileSystem 的第四个参数是一个记录到控制台文件系统 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"}

编辑2:

我试图通过用我自己的函数模拟 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 回答
1

基本问题是如何以及何时deferred.resolve调用。
固定代码:

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

  return {
    Foo: Foo
  }
 }
]);

问题是,当您在角度生命周期之外调用“deferred.resolve”(文件系统请求的回调在角度生命周期之外)时,您必须手动调用“$rootScope.$apply()”,否则将无法解决承诺。

于 2013-09-04T22:32:12.483 回答