对于AngularJS,我是一个完整的新手,尽管我试图尽快学习。我无法理解的是,如果一个函数需要长时间运行的回调。
我正在使用Ionic框架创建Cordova手机应用程序。我通过ngCordova模块使用的一个特定库具有connect
方法。在成功的蓝牙连接上,调用successCallback
。在连接失败时,将调用errorCallback
。这是预期的行为。但是,如果在任何时候发生断开连接,则此特定方法应调用errorCallback
。但是,承诺已经通过successCallback
解决了。
我确实考虑过使用notifyCallback
选项,但如果履行承诺,则无法使用此选项。
这样做的最佳方式是什么?
答案 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;
}
中的用法相同