私は、APIからデータを取得し、各データをSQLLiteデータベースに保存する私の工場です。はangularjsの複数の約束を解決します
team.factory('dataSync', function($q,$http,$timeout,$cordovaSQLite){
return {
getData:function(){
var q = $q.defer();
$http.get(api+'/sync/').then(function(response){
q.resolve(response);
},function(error){
q.reject();
})
return q.promise;
},
saveData:function(){
var q= $q.defer();
this.getData().then(function(result){
var data= result.data;
var sharing = data.sharing;
var help = data.help;
var message = data.message;
var questions = data.question;
var promises = [];
angular.forEach(sharing, function(value, index) {
console.log(value);
var sharingsql="INSERT INTO sharing (id,content_order,content ,last_modified)VALUES(?,?,?,?)";
$cordovaSQLite.execute(db,sharingsql,[value.id,value.content_order,value.content,value.last_modified]).then(function(result){
console.log(result.insertId);
//q.resolve(true);
},function(error){
console.log(error.message);
})
});
angular.forEach(help, function(value, index) {
console.log(value.message);
var helpsql="INSERT INTO help (id,message,message_position,last_modified)VALUES(?,?,?,?)";
$cordovaSQLite.execute(db,helpsql,[value.id,value.message,value.message_position,value.last_modified]).then(function(result){
console.log(result.insertId);
},function(error){
console.log(error.message);
})
});
angular.forEach(message, function(value, index) {
var messagesql="INSERT INTO messages (id,message,message_position,last_modified_date)VALUES(?,?,?,?)";
$cordovaSQLite.execute(db,messagesql,[value.id,value.message,value.message_position,value.last_modified]).then(function(result){
console.log(result.insertId);
},function(error){
console.log(error.message);
})
});
angular.forEach(questions, function(value, index) {
console.log(value.id+' '+index);
var questionsql="INSERT INTO questions (id,question_status,questions,question_order,last_modified)VALUES(?,?,?,?,?)";
$cordovaSQLite.execute(db,questionsql,[value.id,value.question_status,value.question,value.question_order,value.last_modified]).then(function(result){
console.log(result.insertId);
},function(error){
console.log(error.message);
})
});
$timeout(function(){
},2000).then(function(){
//q.resolve(true);
})
},function(error){
q.reject();
});
return q.promise;
}
}
});
$cordovaSQLite.execute
の呼び出しは約束を返します。
私は約束がすべて解決された後にtrue
を返信したいと思います。各ループで解決される約束をすべて解決するにはどうすればよいですか?
これについて検索したところ、答えは$q.all
でした。それから私はこれについていくつかのチュートリアルを読みましたが、ここで実装することはできません。
[遅延反パターン]を避けてください(http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-struction-antipattern-and-how-to-avoid-it)! – Bergi
[AngularJS - 複数のリソースクエリが完了するのを待つ]の可能な複製(http://stackoverflow.com/questions/15299850/angularjs-wait-for-multiple-resource-queries-to-complete) –
はい、 '$ q .allは答えです。どのように使用しようとしたのか教えてください。 – Bergi