Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Javascript简化承诺_Javascript_Angularjs_Promise_Angular Promise - Fatal编程技术网

用Javascript简化承诺

用Javascript简化承诺,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,以下代码段是否等效 版本1 版本2 这两种方法有许多不同之处 这两个代码段之间的主要区别在于,在version 2中,您将解析值从foo直接隐式传递到bar。 除此之外,doSomething将解析bar将解析的内容,而在version 1中,结果将被丢弃 Benjamin Grunbaum提出的一些其他重要观点: (a) 如果bar是参考错误,则1拒绝内部承诺,2 投掷。 (b) 1需要引用$q,其中2是实现 不可知论者。 (c) 版本1不是例外安全的,将被拒绝 在版本2允许的地方吞咽。抓住拒

以下代码段是否等效

版本1 版本2
这两种方法有许多不同之处

这两个代码段之间的主要区别在于,在
version 2
中,您将解析值从
foo
直接隐式传递到
bar
。 除此之外,
doSomething
将解析
bar
将解析的内容,而在
version 1
中,结果将被丢弃

Benjamin Grunbaum提出的一些其他重要观点:

(a) 如果bar是参考错误,则1拒绝内部承诺,2 投掷。
(b) 1需要引用$q,其中2是实现 不可知论者。
(c) 版本1不是例外安全的,将被拒绝 在版本2允许的地方吞咽。抓住拒绝;有 还有几个较小的差异。看见 stackoverflow.com/questions/22539815

你也可以这样写。
这样,您就不会得到解析值从
foo
bar
的隐式传递槽(现在是显式的),这可能会造成混淆或容易忽略。如果您想在返回解析值之前使用
foo
bar
的解析值执行某些操作,那么它也很有用

function doSomething() {
  return foo().then(function(res){
     // maybe  do something with the result of foo
     return bar(res);
  }).then(function(res){
     // maybe do something with the result of bar
     return res;
  });
}
手动创建延迟对象应该保持在最低限度,这通常是一种反模式


此处演示的关键原则是,承诺将在其解析方法中采用返回承诺(或表)的状态。

我对“手动创建差异对象是反模式”的说法感到震惊。我每天都这样做10次,因为我采用了各种博客和教程中的技术。谢谢指点out@Sprottenwels在这里查看我的答案,了解更多信息:@Sprottenwels请注意,在提示API或编写聚合方法时,您应该只创建延迟对象,这种情况很少发生。例如,我有一个带Bluebird的100KLoC代码库,没有一个延迟或承诺构造函数。这里添加的匿名函数没有意义,这里关于匿名函数包装函数引用的语句在任何情况下都是正确的,而不仅仅是承诺。您可能应该在以下内容中编辑一些其他差异:(a)如果
bar
是参考错误,则1拒绝内部承诺,2抛出。(b) 1需要引用
$q
,其中2是实现无关的。(c) 版本1不是异常安全的,如果版本2允许您捕获拒绝,则拒绝将被接受;还有几个较小的差异。关于异常处理,请参见,我还建议您使用此
function doSomething() {
  return foo().then(bar);
}
function doSomething() {
  return foo().then(function(res){
     // maybe  do something with the result of foo
     return bar(res);
  }).then(function(res){
     // maybe do something with the result of bar
     return res;
  });
}