我正在编写一个异步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开发的新手,非常感谢您的观点:)
答案 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哪些角度广告。作为一个规范,它是我遇到的最简单和最容易理解的一个(尽管我应该提到我已经参与了规范很长一段时间了。)