在 angularjs 中解决多项承诺
resolve multiple promises in angularjs
这是我的工厂,它从 API 获取数据并将每个数据存储到 SQLLite 数据库。
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
return 的调用是一个承诺。
我想returntrue
等所有的承诺都兑现之后。如何解决每个循环中解决的所有承诺?
当我搜索这个时,我找到了 $q.all
作为答案。然后我看了一些关于这个的教程但是不能在这里实现。
把所有的promise放到一个数组中然后使用$q.all(yourArray).
这是您更新后的代码 - 您不需要使用 $q.defer()
,因为 $http
已经 return 是一个承诺 - 您所有的 $cordovaSQLite
承诺都将得到解决自己
team.factory('dataSync', function($q,$http,$timeout,$cordovaSQLite ){
return {
getData:function(){
return $http.get(api+'/sync/').then(function(response){
return response;
},function(error){
$q.reject();
})
},
saveData:function(){
return 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(?,?,?,?)";
promises.push($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(?,?,?,?)";
promises.push($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(?,?,?,?)";
promises.push($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(?,?,?,?,?)";
promises.push($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);
}));
});
return $q.all(promises);
},function(error){
return $q.reject();
});
}
}
});
这样,当您调用 saveData()
时,它将 return 一个承诺,一旦您的所有 $cordovaSQLite
都已解决,您就可以使用 .then()
来完成在这一切发生之后你想要什么。
注:
我认为可以删除所有错误处理程序并仅使用一个 "catch" 函数
是的,使用 $q.all()
. Push the promises into the array, but remove the .then()
callbacks. Promise.then()
return 承诺,因此如果 .then()
回调未被删除,则需要将它们更新为 return 参数(即 result
).
promises.push($cordovaSQLite.execute(db,sharingsql,[value.id,value.content_order,value.content,value.last_modified]))
然后通过调用 .then()
来使用 $q.all(promises)
,其中 true
可以 returned:
$q.all(promises)
.then(function(responses) {
//all promises have been resolved
return true;
})
请参阅 this plunker 中的演示。
这是我的工厂,它从 API 获取数据并将每个数据存储到 SQLLite 数据库。
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
return 的调用是一个承诺。
我想returntrue
等所有的承诺都兑现之后。如何解决每个循环中解决的所有承诺?
当我搜索这个时,我找到了 $q.all
作为答案。然后我看了一些关于这个的教程但是不能在这里实现。
把所有的promise放到一个数组中然后使用$q.all(yourArray).
这是您更新后的代码 - 您不需要使用 $q.defer()
,因为 $http
已经 return 是一个承诺 - 您所有的 $cordovaSQLite
承诺都将得到解决自己
team.factory('dataSync', function($q,$http,$timeout,$cordovaSQLite ){
return {
getData:function(){
return $http.get(api+'/sync/').then(function(response){
return response;
},function(error){
$q.reject();
})
},
saveData:function(){
return 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(?,?,?,?)";
promises.push($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(?,?,?,?)";
promises.push($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(?,?,?,?)";
promises.push($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(?,?,?,?,?)";
promises.push($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);
}));
});
return $q.all(promises);
},function(error){
return $q.reject();
});
}
}
});
这样,当您调用 saveData()
时,它将 return 一个承诺,一旦您的所有 $cordovaSQLite
都已解决,您就可以使用 .then()
来完成在这一切发生之后你想要什么。
注: 我认为可以删除所有错误处理程序并仅使用一个 "catch" 函数
是的,使用 $q.all()
. Push the promises into the array, but remove the .then()
callbacks. Promise.then()
return 承诺,因此如果 .then()
回调未被删除,则需要将它们更新为 return 参数(即 result
).
promises.push($cordovaSQLite.execute(db,sharingsql,[value.id,value.content_order,value.content,value.last_modified]))
然后通过调用 .then()
来使用 $q.all(promises)
,其中 true
可以 returned:
$q.all(promises)
.then(function(responses) {
//all promises have been resolved
return true;
})
请参阅 this plunker 中的演示。