0

在 AngularJS 方面,我是一个完全的新手,尽管我正在尝试尽快学习。如果一个函数需要一个长时间运行的回调,我无法理解。

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

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

做这个的最好方式是什么?

4

2 回答 2

1

这是我将实现的函数的文档,以便能够通过这个 API 使用 Promise。我将把实现留作练习:

/**
 * 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");
});
于 2015-04-08T00:13:05.207 回答
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 的回答相同

于 2015-04-08T14:12:54.887 回答