$ q.when不能与匿名函数一起使用

时间:2015-07-23 18:23:42

标签: javascript angularjs promise

我正在尝试将一个同步函数包装在一个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
});

2 个答案:

答案 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)执行你传递的参数。