AngularJS+;如何在运行下一个任务之前等待任务完成
我的数据库仍然有问题,但我发现,问题来自于这样一个事实,打开数据库需要一些时间,但应用程序并没有等到这个任务完成 有没有办法让angular在数据库正确打开后再开始下一个任务 谢谢, 基督教徒AngularJS+;如何在运行下一个任务之前等待任务完成,angularjs,Angularjs,我的数据库仍然有问题,但我发现,问题来自于这样一个事实,打开数据库需要一些时间,但应用程序并没有等到这个任务完成 有没有办法让angular在数据库正确打开后再开始下一个任务 谢谢, 基督教徒 更新:2016-08-08-03:13下午 谢谢你的回答。正如我所见,我的第一个承诺($q)的想法是正确的,但是: 我的应用程序有一个app.js,它是我的主文件。它只调用InitDB。这将打开数据库。然后它应该调用CreateTables,这将创建表,如果它不存在的话 我的应用程序的其余部分分为4页(
更新:2016-08-08-03:13下午 谢谢你的回答。正如我所见,我的第一个承诺($q)的想法是正确的,但是: 我的应用程序有一个app.js,它是我的主文件。它只调用InitDB。这将打开数据库。然后它应该调用CreateTables,这将创建表,如果它不存在的话 我的应用程序的其余部分分为4页(模板)。每个页面都有自己的控制器 因此,我们的想法是初始化数据库,创建表,然后使用数据库,但在不同的控制器上使用 这行不通,因为我总是需要把我所有的东西放在app.js中initDB的.then()中 这是我的第一个AngularJS应用程序,也许这就是我犯很多错误的原因 谢谢,
Christian。Angular提供$q的服务。一种服务,可帮助您异步运行函数,并在函数完成处理时使用其返回值(或异常)。请参阅相关文档。
$q基本上围绕承诺的概念展开。AngularJS中的承诺由内置的$q服务提供。Angular提供$q服务。一种服务,可帮助您异步运行函数,并在函数完成处理时使用其返回值(或异常)。请参阅相关文档。
$q基本上围绕承诺的概念展开。AngularJS中的承诺是由内置的$q服务提供的。编写一个方法,检查连接是否建立……返回true或false
app.controller('MainCtrl', function($scope, httpq) {
http.get('server call method')
.then(function(data) {
if(data.conn==true)
// do what u want
//write other calls
})
.catch(function(data, status) {
console.error('error', response.status, response.data);
})
});
写一个方法,检查连接是否建立…返回true或false
app.controller('MainCtrl', function($scope, httpq) {
http.get('server call method')
.then(function(data) {
if(data.conn==true)
// do what u want
//write other calls
})
.catch(function(data, status) {
console.error('error', response.status, response.data);
})
});
您可以使用$q库 例如:
app.service("githubService", function ($http, $q) {
var deferred = $q.defer();
this.getAccount = function () {
return $http.get('https://api.github.com/users/haroldrv')
.then(function (response) {
// promise is fulfilled
deferred.resolve(response.data);
// promise is returned
return deferred.promise;
}, function (response) {
// the following line rejects the promise
deferred.reject(response);
// promise is returned
return deferred.promise;
})
;
};
}))
使用上述服务:
app.controller("promiseController", function ($scope, $q, githubService) {
githubService.getAccount()
.then(
function (result) {
// promise was fullfilled (regardless of outcome)
// checks for information will be peformed here
$scope.account = result;
},
function (error) {
// handle errors here
console.log(error.statusText);
}
);
})) 您可以使用$q库 例如:
app.service("githubService", function ($http, $q) {
var deferred = $q.defer();
this.getAccount = function () {
return $http.get('https://api.github.com/users/haroldrv')
.then(function (response) {
// promise is fulfilled
deferred.resolve(response.data);
// promise is returned
return deferred.promise;
}, function (response) {
// the following line rejects the promise
deferred.reject(response);
// promise is returned
return deferred.promise;
})
;
};
}))
使用上述服务:
app.controller("promiseController", function ($scope, $q, githubService) {
githubService.getAccount()
.then(
function (result) {
// promise was fullfilled (regardless of outcome)
// checks for information will be peformed here
$scope.account = result;
},
function (error) {
// handle errors here
console.log(error.statusText);
}
);
})) Angular的核心概念之一是与服务/工厂合作。关于这些如何工作以及如何使用它们,有大量的文档和博客,但基本思想是这些是处理整个应用程序中共享数据和方法的单例“控制器”。与promises结合使用,您可以轻松创建一个服务来管理与数据库的通信
angular
.module('myApp')
.service('DBService', DBService)
.controller('Ctrl1', Ctrl1)
.controller('Ctrl2', Ctrl2)
.controller('Ctrl3', Ctrl3)
.controller('Ctrl4', Ctrl4);
DBService.$inject = ['$q'];
function DBService($q) {
var DBService = this;
var DBServiceDeferred = $q.defer();
DBService.ready = DBServiceDeferred.promise;
// a service is only initialized once, so this will only ever be run once
(function() {
init();
})();
function init() {
// you can use promise chaining to control order of events
// the chain will halt if any function is rejected
initDB()
.then(createTablesUnlessExist)
.then(setDbReady);
}
function initDB() {
var deferred = $q.defer();
// simulate async db initialization
$timeout(function() {
deferred.resolve();
// or reject if there is an error
// deferred.reject();
}, 5000);
return deferred.promise;
};
function createTablesUnlessExist() {
//create tables if needed (only happens once)
var deferred = $q.defer();
// simulate async table creation
$timeout(function() {
deferred.resolve();
// or reject if there is an error
// deferred.reject();
}, 5000);
return deferred.promise;
}
function setDbReady() {
DBServiceDeferred.resolve();
}
}
现在你有了数据库设置,你不必再担心它了。您可以使用该服务从任何控制器访问数据库。在初始化数据库并创建表之前,不会运行任何查询
Ctrl1.$inject = ['DBService', '$q'];
function Ctrl1(DBService, $q) {
$q.when(DBService.ready).then(function() {
DBService.conn.query("Select something");
});
}
Ctrl2.$inject = ['DBService', '$q'];
function Ctrl2(DBService, $q) {
$q.when(DBService.ready).then(function() {
DBService.conn.query("Select something");
});
}
Ctrl3.$inject = ['DBService', '$q'];
function Ctrl3(DBService, $q) {
$q.when(DBService.ready).then(function() {
DBService.conn.query("Select something");
});
}
Ctrl4.$inject = ['DBService', '$q'];
function Ctrl4(DBService, $q) {
$q.when(DBService.ready).then(function() {
DBService.conn.query("Select something");
});
}
Angular的核心概念之一是与服务/工厂合作。关于这些如何工作以及如何使用它们,有大量的文档和博客,但基本思想是这些是处理整个应用程序中共享数据和方法的单例“控制器”。与promises结合使用,您可以轻松创建一个服务来管理与数据库的通信
angular
.module('myApp')
.service('DBService', DBService)
.controller('Ctrl1', Ctrl1)
.controller('Ctrl2', Ctrl2)
.controller('Ctrl3', Ctrl3)
.controller('Ctrl4', Ctrl4);
DBService.$inject = ['$q'];
function DBService($q) {
var DBService = this;
var DBServiceDeferred = $q.defer();
DBService.ready = DBServiceDeferred.promise;
// a service is only initialized once, so this will only ever be run once
(function() {
init();
})();
function init() {
// you can use promise chaining to control order of events
// the chain will halt if any function is rejected
initDB()
.then(createTablesUnlessExist)
.then(setDbReady);
}
function initDB() {
var deferred = $q.defer();
// simulate async db initialization
$timeout(function() {
deferred.resolve();
// or reject if there is an error
// deferred.reject();
}, 5000);
return deferred.promise;
};
function createTablesUnlessExist() {
//create tables if needed (only happens once)
var deferred = $q.defer();
// simulate async table creation
$timeout(function() {
deferred.resolve();
// or reject if there is an error
// deferred.reject();
}, 5000);
return deferred.promise;
}
function setDbReady() {
DBServiceDeferred.resolve();
}
}
现在你有了数据库设置,你不必再担心它了。您可以使用该服务从任何控制器访问数据库。在初始化数据库并创建表之前,不会运行任何查询
Ctrl1.$inject = ['DBService', '$q'];
function Ctrl1(DBService, $q) {
$q.when(DBService.ready).then(function() {
DBService.conn.query("Select something");
});
}
Ctrl2.$inject = ['DBService', '$q'];
function Ctrl2(DBService, $q) {
$q.when(DBService.ready).then(function() {
DBService.conn.query("Select something");
});
}
Ctrl3.$inject = ['DBService', '$q'];
function Ctrl3(DBService, $q) {
$q.when(DBService.ready).then(function() {
DBService.conn.query("Select something");
});
}
Ctrl4.$inject = ['DBService', '$q'];
function Ctrl4(DBService, $q) {
$q.when(DBService.ready).then(function() {
DBService.conn.query("Select something");
});
}
您可以使用承诺,并在数据库启动时解决它:您可以使用承诺,并在数据库启动时解决它:嗨,JoelCDoyle,这是我阅读的intrestings答案之一。非常感谢。但现在我还有一些问题:1。在工厂中,可以直接调用init()函数。这安全吗?这意味着,当应用程序启动时,这个东西正在进行自身的日化?当应用程序关闭时,如何关闭它?2.我以为我必须把所有的数据库逻辑(CRUD)放在工厂里,但是你从控制器那里调用它?这只是一个简单的例子,还是最佳实践?3.在控制器中,如果DBService没有准备好,任务会等待还是产生错误?无限循环?你好。我使用您的所有提示完全重写了我的工厂,但在setDbReady()函数中,我总是会遇到一个错误。我没有使用DBService,而是使用PersistenceService。所以当我执行PersistenceService.ready.resolve()时;我得到错误类型error:PersistenceService.ready.resolve不是一个函数。。。有什么想法吗?谢谢,克里斯蒂安。你是对的,你不想从控制器内部进行查询,那只是为了演示。您可能希望在服务中创建控制器可以调用以进行查询的方法。我的代码有错误。这是一个带有正确工作代码的plunker。观察控制台以查看操作顺序:就关闭连接而言,您可以向服务添加一个关闭连接的方法。是,初始化服务时调用init方法。没有什么不安全或不正常的,但你可以做任何你真正想做的事。通过向服务中添加close方法,您可以像打开它一样轻松地关闭它。这些任务将按照您指定的顺序、时间段执行。如果一个任务中存在错误,则将取消所有其他任务。您可以通过“reject()”来查看这种行为,方法是在过程中的任何时候对延迟进行“reject()”,而不是解决它。嗨,JoelCDoyle。谢谢你的提示和工作。我想,我仍然有一个理解上的问题:这个系统只等待任务,不管它们是否工作?因为如果我故意在数据库中产生错误,所有任务都会一步一步地完成。嗨,JoelCDoyle,这是我读到的一个intrestings答案。非常感谢。但现在我还有一些问题:1。事实上