使用Angular的$ q进行长时间回调

时间:2015-04-07 22:47:43

标签: angularjs cordova ionic-framework ngcordova

对于AngularJS,我是一个完整的新手,尽管我试图尽快学习。我无法理解的是,如果一个函数需要长时间运行的回调。

我正在使用Ionic框架创建Cordova手机应用程序。我通过ngCordova模块使用的一个特定库具有connect方法。在成功的蓝牙连接上,调用successCallback。在连接失败时,将调用errorCallback。这是预期的行为。但是,如果在任何时候发生断开连接,则此特定方法调用errorCallback。但是,承诺已经通过successCallback解决了。

我确实考虑过使用notifyCallback选项,但如果履行承诺,则无法使用此选项。

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

这里是我将实现的函数的文档,以便能够使用此API的promises。我将把实现作为练习:

/**
 * Tries connecting using bluetooth. Returns a promise. 
 * If the connection doesn't succeed, the returned promise is rejected.
 * If the connection succeeds, the returned promise is resolved with
 * an other promise (that we will call disconnectionPromise). 
 * This disconnectionPromise is never resolved.
 * It's rejected once the connection (which has been 
 * successfully established) fails. 
 */
function connect() {
    ...
}

因此,一个示例用法是:

var blueToothConnection = service.connect();
blueToothConnection.then(function(disconnectionPromise) {
    console.log("connection successfully established");
    disconnectionPromise.catch(function() {
        console.log("connection lost");
    });
}).catch(function() {
    console.log("impossible to establish a connection");
});

答案 1 :(得分:0)

我没有意识到,即使原始承诺已经解决,也会调用错误回调。唯一的区别是拒绝并没有得到处理,因为承诺得以实现。

原始代码是:

  connect: function (address) {
    var q = $q.defer();
    $window.bluetoothSerial.connect(address, function () {
      q.resolve();
    }, function (error) {
      q.reject(error);
    });
    return q.promise;
  }

现在更新的代码:

  connect: function (address) {
    var q = $q.defer();
    var disconnectionPromise = $q.defer();
    var isConnected = false;
    $window.bluetoothSerial.connect(address, function () {
      isConnected = true;
      q.resolve(disconnectionPromise);
    }, function (error) {
      if(isConnected === true) {
      disconnectionPromise.reject(error);
      }
      q.reject(error);
    });
    return q.promise;
  }

用法与JB Nizet's answer

中的用法相同