所以一直在努力使得承诺正常工作,但经过大量的工作,我想我已经得到了它。所以现在问题是,如果你不想等待真实的东西,你能创造一个自我实现的承诺......
我想做的短伪版本 var promise;
if (!factory.isDataLoaded()){
//The data is not loaded
var promise = factory.init();
} else {
//Data is all loaded
var promise = getSelfFullfilingPromise
}
//Some other code
promise.then(function({
//Do some stuff with the data from factory. which we know is loaded
})
考虑这个选项(直接从我的应用程序中获取)。我有一个工厂加载了几个表,特别是一个表,它将ID从一个表转换为另一个表中的名称,状态等数组。然后代码用它做各种奇妙的事情。 好吧,它做了一些按摩,制作漂亮的图表。问题是,如果工厂的启动(即进行API调用,获取一些数据,将其存储在变量中)还没有完成,我的一半页面不会渲染,我的老板生气,我被解雇了,我'我不得不在垃圾箱后面潜入麦当劳(好吧,不是那么糟糕)。
所以我的init api致电承诺,甜蜜。 然后创建一个返回状态的辅助函数(它检查变量中是否有数据并返回true或false)。我有自己的请求(idGetSkill)。
然后我还有一个调用大约20次的指令,所以我真的不想调用我的init 20次以确保有数据。如果数据为空,或者skillLoaded返回false,我只想调用它。
但是如果我使用.then作为回调,我需要一个解决它运行的承诺。所以在想。
可以使用它的示例: 工厂
.factory('skillFactory', function($http) {
var skillFactory = [];
var skills = [];
var searchId = [];
var mySkillId = [];
skillFactory.init= function() {
console.log("Got called")
return $http.get('/api/skillList')
.then(function(data){
skills=data['data']
console.log('Skill test ' + skills[0].alias );
})
}
skillFactory.skillLoaded=function(){
if(skills.length < 1) {
console.log("Warning, no data");
return false;
} else {
return true;
}
}
skillFactory.idGetSkill = function(data) {
if (skills.length < 1){
console.log("Warning, no data");
} else {
for (var id in skills) {
if (data == skills[id]._id) {
return skills[id];
}
}
}
}
}
一个叫它的应用程序
.controller("PromiseLoad", function ($scope, $http, $window, skillFactory ) {
var promise;
if( ! skillFactory.skillLoaded() ){
promise = skillFactory.init();
} else {
promise = skillFactory.init();
}
var skill = '55c8a069cca746f65c9836a1'
console.log("Will ask for skill " + skill)
promise.then( function() {
console.log("Im done waiting!")
$scope.answer = skillFactory.idGetSkill(skill);
console.log ("And got " +$scope.answer.alias);
})
});
(好吧,上面的例子并不真的需要它,但它更容易提供这个例子而不是指令,因为它需要更多的工作。比如数据和东西:))