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

Javascript angularJS中$q.when和$q.defer之间的差异,javascript,angular-promise,Javascript,Angular Promise,我看到angularJS文件,在某些地方,reviewer评论了以下三行: var deferred = $q.defer(); deferred.resolve(BrandList); return deferred.promise; 并替换为这个: return $q.when(BrandList); 我想了解两者之间的区别。两者的作用相同吗?Ben Nadal很好地解释了这一点,那么应该使用哪一个呢 用他的话说: $q.when()方法不仅仅创建一个立即解决的承诺;相反,它规范化了一个

我看到angularJS文件,在某些地方,reviewer评论了以下三行:

var deferred = $q.defer();
deferred.resolve(BrandList);
return deferred.promise;
并替换为这个:

return $q.when(BrandList);

我想了解两者之间的区别。两者的作用相同吗?Ben Nadal很好地解释了这一点,那么应该使用哪一个呢

用他的话说:

$q.when()方法不仅仅创建一个立即解决的承诺;相反,它规范化了一个值,该值可能是也可能不是“thenable”对象。如果给定的值是一个承诺,$q.when()将正确地从中链接出来。如果给定值不是承诺,$q.when()将创建使用给定值解析的承诺

因此,从本质上讲,它要么接受承诺,要么不接受承诺,并使用一些魔法来确保它们要么得到解决,要么被承诺包装起来,这样就不会破坏承诺链。

$q.defer()
在您希望将函数修饰为使用承诺而不是回调时是合适的。通常,您将指定一个
deferred.resolve()
和一个
deferred.reject()
,甚至可能指定一个
deferred.notify()

$q.when()
适用于您希望立即创建新承诺并将其解析为值的情况编辑它还将变量规范化为承诺,这在变量可能是或可能不是承诺时非常有用。看看吉姆的答案


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

是的,他们也这样做。但是只有第二个函数表达了我们的意图(而且它也更短)。因此,我们可以在代码中的任何时间点使用这两个函数中的任何一个??好吧,
$q。当
是单个函数,并且可以传递时。对它的调用会生成一个可以在任何地方使用的表达式,而带有
$q.defer()
的第一个代码段包含多个语句。