簡體   English   中英

Angularjs使用promise在另一個之后加載資源

[英]Angularjs load resources on after the other using promise

在服務中,我想使用$ http加載資源。 加載資源后,我想將其存儲在變量中。 然后,我需要加載子資源並存儲它。 我知道這個承諾是為這種工作而設計的,但似乎有很多如何使用它我有點混亂。 這是我的代碼:

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承諾,所有承諾將立即得到解決。 我相信你想要的是將它們全部鏈接起來,當第一個承諾得到解決時,你要求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){});

loadTodosaveTodo是pararell,它們沒有相互鏈接。 他們都收到相同的data

我建議的方法是:

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

未經測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM