自我实现承诺的角度设计模式

时间:2015-08-14 05:12:10

标签: angularjs asynchronous

所以一直在努力使得承诺正常工作,但经过大量的工作,我想我已经得到了它。所以现在问题是,如果你不想等待真实的东西,你能创造一个自我实现的承诺......

我想做的短伪版本 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);
    })


});

(好吧,上面的例子并不真的需要它,但它更容易提供这个例子而不是指令,因为它需要更多的工作。比如数据和东西:))

1 个答案:

答案 0 :(得分:1)

$q.when(data)会返回已解决的承诺。

$q.reject(data)会返回被拒绝的承诺。