【发布时间】:2015-11-07 06:35:47
【问题描述】:
所以一直在努力让承诺正常工作,但经过大量工作,我认为我已经做到了。所以现在问题来了,如果你不想等待真实的东西,你能不能创造一个自我实现的承诺......
我想做的简短伪版本 var 承诺;
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 调用变成了一个承诺,亲爱的。 然后创建了一个返回状态的辅助函数(它检查变量中是否有数据并返回真或假)。我有自己的请求(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);
})
});
(好吧,上面的例子并不真正需要它,但是提供这个例子而不是指令更容易,因为它需要更多的东西才能工作。比如数据和东西:))
【问题讨论】: