我有一个数据服务,它将处理我所有与数据相关的操作,所有这些操作都是异步的。
点击ERASE按钮后,有一个功能会删除所有数据并返回包含操作状态的对象(成功:真/假)。
基于此值(TRUE),我需要路由到另一个视图(Say Data Successfully erased page)。
但是当我第一次点击按钮时没有发生路由(但是擦除功能正在给出正确的值(true)。 但是,如果我再次点击相同的按钮,路线就会发生。
这是我如何使用 removeDatabase()(dataService的一部分)函数。
self.removeDatabase = function () {
//$location.path("/setup");
dataService.resetDatabase().done(function (msgs) {
if(msgs['Operation_success']){
console.log("Operation is Success ? :"+msgs['Operation_success']);
$location.path("/setup");
//self.loadSetup();
}
});
},
这是服务中的功能。
appdata.resetDatabase = function () {
appdata.msgs = {};
var deferred = jQuery.Deferred();
appdata.db = window.openDatabase("finbud_db", "1.0", "FinBud", 20);
var d1 = jQuery.Deferred();
appdata.db.transaction(function (tx) {
tx.executeSql('DROP TABLE IF EXISTS BASE_TABLE');
}, function () {
appdata.msgs['BASE_TABLE'] = "Could not Delete";
appdata.msgs['Operation_success'] = false;
d1.resolve();
}, function () {
appdata.msgs['BASE_TABLE'] = "Deleted";
appdata.msgs['Operation_success'] = true;
d1.resolve();
});
var d2 = jQuery.Deferred();
appdata.db.transaction(function (tx) {
tx.executeSql('DROP TABLE IF EXISTS CATEGORY_TABLE');
}, function () {
appdata.msgs['CATEGORY_TABLE'] = "Could not Delete";
appdata.msgs['Operation_success'] = false;
d2.resolve();
}, function () {
appdata.msgs['CATEGORY_TABLE'] = "Deleted";
appdata.msgs['Operation_success'] = true;
d2.resolve();
});
var d3 = jQuery.Deferred();
appdata.db.transaction(function (tx) {
tx.executeSql('DROP TABLE IF EXISTS ACCOUNTS_TABLE');
}, function () {
appdata.msgs['ACCOUNTS_TABLE'] = "Could not Delete";
appdata.msgs['Operation_success'] = false;
d3.resolve();
}, function () {
appdata.msgs['ACCOUNTS_TABLE'] = "Deleted";
appdata.msgs['Operation_success'] = true;
d3.resolve();
});
var d4 = jQuery.Deferred();
appdata.db.transaction(function (tx) {
tx.executeSql('DROP TABLE IF EXISTS TRANSACTIONS_TABLE');
}, function () {
appdata.msgs['TRANSACTIONS_TABLE'] = "Could not Delete";
appdata.msgs['Operation_success'] = false;
d4.resolve();
}, function () {
appdata.msgs['TRANSACTIONS_TABLE'] = "Deleted";
appdata.msgs['Operation_success'] = true;
d4.resolve();
});
jQuery.when(d1, d2, d3, d4).done(function () {
deferred.resolve(appdata.msgs);
});
return deferred.promise();
};
最后HTML是:
<md-button ng-click="appCtrl.removeDatabase();">
<i class="mdi mdi-reload"></i> Reset App
</md-button>
任何帮助表示赞赏。 THANKYOU
答案 0 :(得分:1)
您必须致电$scope.$digest()
以通知角度已发生变化。我建议使用$q
promise库中的angular而不是jquery promises:
var d1 = $q.defer();
...
d1.resolve();
...
return $q.all([d1, d2, d3, d4]).then(function () {
return appdata.msgs;
});
答案 1 :(得分:1)
karaxuna提供的答案是对的。这是答案的延伸。
如果我在下面这样做,这将在一个中返回所有4个承诺。所需的数据是 appdata.msgs ,它位于每个承诺内(d。$$状态内)。
var d1 = $q.defer();
...
d1.resolve();
...
return $q.all([d1, d2, d3, d4]).then(function () {
return appdata.msgs;
});
&#13;
默认情况下,所有函数都将返回延迟对象。但我想明确地返回 appdata.msgs 。所以现在我需要4个函数来返回数据而不是延迟。
为实现这一目标,我将在四个函数的每个函数中使用 appdata.msgs (最后也返回相同的内容)来解决这个问题。
现在所有()函数将在所有这些函数解析后返回 appdata.msgs (请记住我已使用 appdata.msgs 解决)。
代码如下:
function d1() {
var d1 = $q.defer();
......
//some where
d1.resolve(msgs);
.......
return d1.promise;
}
................
function dN() {
var dN = $q.defer();
......
//some where
dN.resolve(msgs);
.......
return dN.promise;
}
return $q.all([d1(), d2(), ....., dN()]).then(
function () {
return msgs;
},
function(){
msgs['Operation_success'] = false;
return msgs;
});
&#13;
如果我的理解是错误的,请纠正我。 三江源。