angularJS中$ q.when和$ q.defer之间的差异

时间:2015-07-06 17:06:45

标签: javascript angular-promise

我看到angularJS文件,在某些地方,评论者评论了这3行:

var deferred = $q.defer();
deferred.resolve(BrandList);
return deferred.promise;

并替换为这个:

return $q.when(BrandList);

我想了解两者之间的区别。两者都有同样的目的吗?什么时候应该使用?

2 个答案:

答案 0 :(得分:4)

Ben Nadal在解释这个here方面做得很好。

用他的话说:

  

$ q.when()方法并不只是创建一个立即解决的承诺;相反,它规范了一个值,该值可能是也可能不是"可能的"宾语。如果给定的值是一个promise,$ q.when()将正确地链接它。如果给定的值不是promise,$ q.when()将创建使用给定值解析的promise。

所以基本上它需要承诺或非承诺,并做一些魔术,以确保它们被解决或承诺包装,以免打破承诺链。

答案 1 :(得分:0)

当你想要装饰一个函数来使用promises而不是回调时,

$q.defer()是合适的。通常,您会指定deferred.resolve()deferred.reject(),甚至可以指定deferred.notify()

当您想立即创建新承诺并将其解析为值时,

$q.when()是合适的。 编辑它还将变量规范化为承诺,如果变量可能是也可能不是承诺,这很有用。看到吉姆的回答。

$q.when()似乎适合您的情况。