Javascript 角度:立即从单击功能返回

Javascript 角度:立即从单击功能返回,javascript,angularjs,promise,Javascript,Angularjs,Promise,我的页面上有一个下拉菜单,它实际上只是一个无序列表,其中每个菜单项看起来像: <li ng-click='doCalc(5)'>Five</li> 这意味着factorial运行时,菜单保持在屏幕上。我希望doCalc立即返回,而不是等待factorial完成运行 我知道如何做到这一点,没有延迟设置超时,并承诺但是做这件事的方法是什么呢?搜索“angular promise”会产生大量关于HTTP请求的结果,而我在这里只是做一个简单的计算。可以使用$q服务或$timeo

我的页面上有一个下拉菜单,它实际上只是一个无序列表,其中每个菜单项看起来像:

<li ng-click='doCalc(5)'>Five</li>
这意味着
factorial
运行时,菜单保持在屏幕上。我希望
doCalc
立即返回,而不是等待
factorial
完成运行


我知道如何做到这一点,没有延迟设置超时,并承诺但是做这件事的方法是什么呢?搜索“angular promise”会产生大量关于HTTP请求的结果,而我在这里只是做一个简单的计算。

可以使用
$q
服务或
$timeout
服务创建承诺

function doCalc(num) {
    return $q.when(factorial(num));
};


是否有一个或另一个偏好?如果我在页面中有很多异步请求,什么时候会被阻止


$q
服务和
$timeout
服务都使用
$q
队列(以及
setTimeout
下面的队列)。请注意,浏览器队列和角度
$q
队列都在单个线程上运行。这意味着,
factorial
函数一旦启动,就会运行到完成。如果您担心
阶乘
服务会导致其他非同步操作出现问题,那么该函数需要通过多次调用
$q.when
$timeout
(两者最终都调用
setTimeout
)来分解。

我认为您应该坚持
setTimeout
,在使用
$timeout
的方式中,是否有一个首选项?如果我在页面中也有很多异步请求,什么时候会被阻止?为什么要通过
ng单击
函数返回承诺
ng click
不需要任何值。将内容返回到函数使其更通用。OP可能会决定在其他上下文中使用该函数。关于您的编辑:所以我猜使用$q.when永远不会比使用$timeout更糟糕?我之所以这么问,是因为
when
语法在我看来非常简洁。@SteveD在这种情况下,我会选择
$q.when
。除非已经注入$timeout。这真的没什么大不了的。很高兴知道这两种方法都有效。
function doCalc(num) {
    return $q.when(factorial(num));
};
function doCalc(num) {
    return $timeout(function() {return factorial(num)}, 0);
};