从一个能够很快解决这个承诺的函数中返回角度承诺

时间:2013-07-25 07:59:59

标签: javascript angularjs promise

我正在编写一个异步javascript函数,消费者会调用​​它来获取某些数据。以下是我最初编写的简单实现(为了清楚起见,删除了错误处理和其他内容)。

function getData(callback){
    if (data is available as a JavaScript object){
        callback(data);
    }else{
        getAsyncData(function(data){
             //some transformations on data
             callback(data); 
        });
    }
}

重要的是要注意,如果数据已经作为JavaScript对象可用,getData可以快速返回数据。

我想将此实现替换为将promise对象返回给调用者的实现。这个小提琴显示了示例实现 - http://fiddle.jshell.net/ZjUg3/44/

问题 - 由于getData可以快速返回,即使在调用者使用 解析 承诺>那么 方法?只是为了模拟这个,如果我在setTimeout函数中调用 然后 方法(零延迟),那么回调就不会被调用。如果我在setTimeout函数之外调用 然后 方法,则会调用callback。我不确定这是否是一个有效的关注或有效的用例。我是angularjs开发的新手,非常感谢您的观点:)

2 个答案:

答案 0 :(得分:5)

如果您希望getData()返回$q承诺而不是使用回调,我会使用$q.when()和通常的$q.resolve()执行以下重构:

function getData()
{
    if (data is available as a JavaScript object) {
        return $q.when(data); // resolves immediately
    } else {
        var q = $q.defer();
        getAsyncData(function(data){
             //some transformations on data
             q.resolve(data); 
        });
        return q.promise;
    }
}

答案 1 :(得分:3)

不,作为承诺的一个重要而重要的部分是,当您附加处理程序时无关紧要。即使您现在创建了一个承诺并立即解决它,然后让您的计算机在接下来的50年内保持运行,然后附加一个它仍将触发的处理程序。

所有这一切都假设angularjs的promise实现中没有bug / corner案例。如果它不起作用,那它就是一个bug。

如果您需要了解承诺如何运作,您可以随时参考Promises/A+ spec哪些角度广告。作为一个规范,它是我遇到的最简单和最容易理解的一个(尽管我应该提到我已经参与了规范很长一段时间了。)