javascript - Angularjs 使用 Promise 在另一个之后加载资源

标签 javascript angularjs promise

在服务内部,我想使用 $http 加载资源。加载资源后,我想将其存储在变量中。然后,我需要加载子资源并存储它。我知道 Promise 是为此类工作而设计的,但似乎有太多如何使用它,我有点困惑。这是我的代码:

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()

提前致谢!

最佳答案

如果我理解正确的话,这比乍一看要棘手。您似乎需要一个函数来链接两个异步进程,并返回一个包含第一个第二个进程获取的数据的复合值的 promise 。

至少有两种方法可用:

  • 简单但不优雅:在每个异步过程中,将所需的值累积为外部对象的属性。
  • 优雅但笨拙:从每个异步进程中,将所需的值累积为对象的属性,并返回该对象的 promise 。

下面的代码采用第一种方法:

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);
});

未经测试

关于javascript - Angularjs 使用 Promise 在另一个之后加载资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16199425/

相关文章:

javascript - JavaScript 语法晦涩难懂

javascript - 使用 javascript 或 php 从图像中获取所有十六进制值

javascript - 需要在IE窗口打开blob/PDF

javascript - Angular2 http.get 预检问题

javascript - 带有ajax调用的javascript中的 promise 链

Javascript,我可以将其更改为循环吗?

带有 AJAX 数据源、排序和过滤的 Angularjs ng-table

javascript - 每个具有闭包范围变量的 Angular

javascript - 是否有可能在任何 promise 完成时履行 promise ?

javascript - 在 promise 中 react setState 导致无限循环