【问题标题】:Angular design pattern for self fulfilling promise自我实现承诺的角度设计模式
【发布时间】: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);
    })


});

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

【问题讨论】:

标签: angularjs asynchronous


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 2016-11-07
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多