Javascript Angularjs使用promise一个接一个地加载资源
在服务内部,我想使用$http加载资源。加载资源后,我希望将其存储在变量中。然后,我需要加载一个子资源并存储它。我知道promise是为这类工作而设计的,但似乎有太多的方法来使用它,我有点困惑。这是我的密码:Javascript Angularjs使用promise一个接一个地加载资源,javascript,angularjs,promise,Javascript,Angularjs,Promise,在服务内部,我想使用$http加载资源。加载资源后,我希望将其存储在变量中。然后,我需要加载一个子资源并存储它。我知道promise是为这类工作而设计的,但似乎有太多的方法来使用它,我有点困惑。这是我的密码: var project = {}; var todo = {}; function init(){ var idProject = 21; var idTodo = 6; // If idProject is sp
var project = {};
var todo = {};
function init(){
var idProject = 21;
var idTodo = 6;
// If idProject is specified
if ( idProject != null ) {
// First, load project data
var promise = WorkspaceManager.getProject($rootScope.workspace, idProject);
// Then save project data
promise.then(function(response){
project = response.data;
return project;
});
if ( idTodo != null ) {
// Then load todo data
promise.then(function(project){
return ProjectManager.getTodo(project, idTodo);
});
// Then save todo data
promise.then(function(response){
todo = response.data;
return todo;
});
}
}
console.log(project); // returns {}
}
init()
提前谢谢 按照你的方式,你创造了源于第一个承诺的“兄弟”承诺。一旦
WorkspaceManager.getProject
promise得到解决,所有承诺都将得到解决。我相信你们想要的是把它们都链接起来,当第一个承诺得到解决时,你们会要求提供Todo数据,当你们得到它时,你们会要求保存它。如果是这种情况,您应该从每个承诺中获取派生承诺
// Then save project data
promise = promise.then(function(response){
project = response.data;
return project;
});
// Then load todo data
promise = promise.then(function(project){
return ProjectManager.getTodo(project, idTodo);
});
// Then save todo data
promise.then(function(response){
todo = response.data;
return todo;
});
为了进一步说明,第一种方法如下:
var mainPromise = ...;
mainPromise.then(function loadTodo(mainPromiseReturn){});
mainPromise.then(function saveTodo(mainPromiseReturn){});
loadTodo
和saveTodo
是平行的,它们没有相互链接。它们都接收相同的数据
我建议的方法是:
var mainPromise = ...;
mainPromise
.then(function loadTodo(mainPromiseReturn){})
.then(function saveTodo(loadTodoReturn){});
如果我理解正确的话,这比乍一看要复杂得多。您似乎需要一个函数来链接两个异步进程,并返回由第一个和第二个进程获取的数据组成的复合值 至少有两种方法可用:
- 简单但不美观:在每个异步过程中,将所需的值累积为外部对象的属性
- 优雅但笨拙:从每个异步进程中,将所需的值累积为对象的属性,并返回一个承诺
function init() {
var idProject = 21;
var idTodo = 6;
var projectObj = {};//This object acts as a "bank" for asynchrounously acquired data.
if ( idProject != null ) {
return WorkspaceManager.getProject($rootScope.workspace, idProject).then(function(response) {
projectObj.project = response.data;//put `response.data` in the bank as .project.
if( idTodo != null ) {
return ProjectManager.getTodo(response.data, idTodo);
}
}).then(function(toDo) {
projectObj.toDo = toDo;//put `toDo` in the bank as .toDo .
return projectObj;
});
}
}
init().then(function(projectObj) {
console.log(projectObj.project);
console.log(projectObj.toDo);
});
或者(仍然是第一种方法)使用错误处理程序:
function init() {
var idProject = 21;
var idTodo = 6;
var projectObj = {};//This object acts as a "bank" for asynchrounously acquired data.
if ( idProject != null ) {
return WorkspaceManager.getProject($rootScope.workspace, idProject).then(function(response) {
projectObj.project = response.data;//put `response.data` in the bank as .project.
if( idTodo != null ) {
return ProjectManager.getTodo(response.data, idTodo);
}
else {
$q.defer().reject('idTodo invalid');
}
}).then(function(toDo) {
projectObj.toDo = toDo;//put `toDo` in the bank as .toDo .
return projectObj;
});
}
else {
return $q.defer().reject('idProject invalid');
}
}
init().then(function(projectObj) {
console.log(projectObj.project);
console.log(projectObj.toDo);
}, function(errorMessage) {
console.log(errorMessage);
});
未经测试什么是
退货项目代码>和返回todo代码>应该做什么?它保持承诺序列继续。它将在下一个中检索,然后
。如下所示:if(idTodo!=null){//然后加载todo数据promise.Then(函数(项目){
不,结果只会在链式连接中使用-如果您对同一承诺进行了大量回调,则不会使用。感谢这两个答案,我尝试了一下,让您知道哪一个更适合我。Frank6,这两个答案基本相同,只是在第一个版本中,为了清楚起见,我省略了错误处理。