2015-10-13 162 views
0

我使用Parse.com來存儲我的應用程序的數據,我目前堅持一些嵌套的承諾。我是很新的這個概念,我寫道:嵌套承諾與列表

this.loadCategories = function() { 
     var global = ParseService.toAngularPromise(new Parse.Query(Categories).find()); 
     global.then(function(categories){ 
     return categories.forEach(function (category){ 
      var criteriaPerCategory = ParseService.toAngularPromise(category.relation('relevantCriteria').query().find()); 
      return criteriaPerCategory.then(function (allCriteriaPerCategory){ 
      category._criteria = allCriteriaPerCategory; 
      }); 
     }); 
     }); 
     return global; 
    }; 

它幾乎工程...所有的承諾都得到除了最後一個執行:本應在角視圖加載之前被調用,它基本上工作除了在創建視圖後調用行​​,我不明白爲什麼。

我知道這種寫作承諾的風格並不是很理論,但我沒有找到任何更好的解決方案,因爲這個清單...我很樂意獲得關於我的代碼的一些見解!

ParseService只是一個服務,從正常的JS承諾創造角承諾。

+0

'global.then'的'return'是'categories' ....返回'forEach'沒有事情。如果你需要完成這些,可能需要'$ q.all()' – charlietfl

回答

1

一點時間,我改變策略後,結束了與:

this.loadCategories2 = function() { 

    function loadAllData(category) { 
     var relatedCriteria = category.relation('relevantCriteria').query().find().then(function (criteria) { 
     category._criteria = criteria; 
     return category; 
     }); 
     return $q.when(relatedCriteria); 
    } 

    return ParseService.toAngularPromise(new Parse.Query(Categories).find()).then(function (categories) { 
     return $q.all(categories.map(loadAllData)) 
    }) 
    } 

我在評論對這個問題的答案很感興趣,但它基本上做我期待的:)

+0

我認爲你應該做'categoryToAdd._criteria = category [1];在'loadAllData'的''then'回調中返回categoryToAdd;'部分。這樣你就不需要返回'$ q.all([$ q.when(category),relatedCriteria])' – Bergi

+0

但是'loadAllData'不是'then'處理程序的一部分。它是疊加承諾的映射函數。 – MinusFour

+0

@Bergi我做了你的改變,它仍然有效!我剛剛編輯了我的答案。非常感謝 –

2

你的循環正在向風中發出承諾,沒有鏈接被完成。您需要將所有這些承諾堆疊起來,然後檢查所有這些承諾何時完成。這可以通過map$q.all輕鬆完成。你只需要注入該依賴關係。

this.loadCategories = function() { 
    var global = ParseService.toAngularPromise(new Parse.Query(Categories).find()); 
    return global.then(function(categories){ 
    return $q.all(categories.map(function (category){ 
     var criteriaPerCategory = ParseService.toAngularPromise(category.relation('relevantCriteria').query().find()); 
     return criteriaPerCategory.then(function (allCriteriaPerCategory){ 
     category._criteria = allCriteriaPerCategory; 
     return category; 
     }); 
    })); 
    }); 
}; 
+0

嘿,謝謝,你能解釋一下map函數的作用嗎? –

+0

它爲您提供返回的承諾數組。它從字面上將你的承諾堆疊成一個新的陣列。然後,'$ q.all'用於每個承諾完成後解決。 – MinusFour

+0

嗯,我明白你做了什麼,但是我還沒有在視圖創建之前執行最後一行('category._criteria = allCriteriaPerCategory;')(但它在視圖創建後非常有效)。 –

0

試試這個:

categories.reduce(function (p, category) { 
    return p.then(() => ParseService.toAngularPromise(category.relation('relevantCriteria').query().find())); 
}, Promise.resolve()).then(function() { 
    // do whatever. 
});