我正在尝试将一个同步函数包装在一个promise中。
有人可以解释一下这些之间的区别吗?
//不能按预期工作
var promise = $q.promise;
promise = $q.when(function() {
return 'foo';
});
promise.then(function(result) {
console.log('result = ', result); // Prints 'function anonymous()' in chrome console
});
//按预期工作
var promise = $q.promise;
promise = $q.when(getIt());
function getIt() {
return 'foo';
}
promise.then(function(result) {
console.log('result = ', result); // Prints 'foo' in chrome console
});
答案 0 :(得分:2)
它返回匿名函数的原因是,你没有执行函数,你应该自己执行那个函数来调用你的函数。
var promise = $q.promise;
promise = $q.when((function() {
return 'foo';
})());
答案 1 :(得分:0)
$ q.when不打算执行某个功能。它旨在包装一个可能是也可能不是承诺的值。
想象一个获取数据但有缓存的函数,所以如果它被缓存,则值立即返回,否则返回$ http promise。这可能是糟糕的功能设计,但确实存在这样的功能。使用$ q.when允许您使用相同的简单代码对两种情况进行操作(不必检查它是否是承诺或缓存值)。
这对于处理返回奇怪结果的第三方库特别有用。
同样,您可以避免看起来像
的丑陋代码和样板var results = SomeService.getData();
if(results && typeof results.then === "function"){
results.then(doSomething)
}
else {
doSomething(results)
};
相反,你可以通过以下方式获得更简单的东西:
$q.when(SomeService.getData()).then(doSomething);
如果函数的潜在结果(在本例中为SomeService.getData
)本身就是一个函数,那么自动执行该函数将不是预期的行为,因此$q.when
不会(并且不应该) t)执行你传递的参数。