有关承诺的详细信息;例子

白头鹰

我努力实现承诺。(我我理解它们,但是我经常得到意想不到的结果,所以也许我不知道。)

请考虑此代码。

function ap() {
  return new Promise(function(resolve, reject) {
    console.log('function ap starting   want this');
    function ender() {
      console.log('function ender starting   want this');
      return resolve('ender');
      console.log('after return in ender   don\'t want this'); //#1
    }
    ender()
    console.log('after function ender and its resolve ' +
      'for Promise   don\'t want this'); //#2
  }) // Promise
} // ap

console.log('---')
ap()
.then(function(result, error) {
  if (error) console.log ('error ' + error.message)
  console.log('function ap result   result=' + result +
    '   want this')
})

考虑到对诺言的理解,我在console.log语句中包含了很多地方,并指出是否要打印它们。

我期望:

function ap starting   want this
function ender starting   want this
function ap result   result=ender   want this

我不希望在ender(//#1)内部最后一次调用console.log,因为返回值足以使我脱离ender范围。我的小子声称这是“无法到达的”。听起来很一致。

我不希望在ender调用(//#2)之后进行控制台调用,因为ender毕竟解决了Pro的问题,这实际上是ap范围的全部;退出promise并退出ap也就不足为奇了。

我有:

function ap starting   want this
function ender starting   want this
after function ender and its resolve for Promise   don't want this
function ap result   result=ender   want this

问题:这是正确的课程吗?该语言无法识别Pro承诺在ap范围内的突出地位。“返回”足以离开发布者范围,但不能离开ap范围。“ resolve('ender')”足以解决承诺。在ender调用之后,执行链继续,这就是打印不需要的语句的原因。程序员必须发送回调函数的承诺,并得到了封闭函数的范围了。

在正确的假设下,我编写了这段代码。

function bp() {
  return new Promise(function(resolve, reject) {
    console.log('function bp starting   want this')
    function ender() {
      console.log('function ender starting   want this');
      return resolve('ender');
      console.log('after return in ender   don\'t want this');
    }
    ender(); return;
    console.log('after function ender and its resolve ' +
      'for Promise   don\'t want this');
  }) // Promise
} // bp

它与第一个代码的不同之处仅在于我在ender调用后立即添加了返回值。通过ender的唯一途径包括“ return resolve('ender')”;如果在ender调用之后立即添加“ return”,它将使我脱离bp范围,并且一切可能都很好。

考虑到不同的函数名称,我期望得到与以前期望相同的结果,并获得了该结果。好像我的“经验教训”可能接近正确的答案。

接下来,我编写了这段代码(请忽略对j的引用;它们会使人分心;我以为我需要它们来解决后续问题,但这第一次没有用,这使这篇文章简短了!):

function cp(i, j) {
  return new Promise(function(resolve, reject) {
    console.log('function cp starting         i=' + i +
      '   j=' + j + '   want this');
    function ender() {
      console.log('function cp ender starting   i=' + i +
        '   j=' + j + '   want this');
      i++;
      let reps = 3;
      if (i < reps) {
        cp(i, j)
        .then(function(result, error) {
          if (error) {
            console.log('*** error   i=' + i +
              '   j=' + j + '   msg=' + error.message +
              '   want this');
            return reject(error);
          }
          console.log('in cp   cp('+ i + ', ' + j +
            ')     result=' + result + '   want this');
          return resolve(result);
        }) // cp(i) callback
        console.log('in cp   i=' + i + '   j=' + j + '' +
          '   in ender after reject, resolve, and ' +
          'callback   don\'t want this'); //#3
      } // if (i < reps)
      console.log('in cp   resolving   i=' + i +
          '   j=' + j + '      want this')
      return resolve('done');
    } // ender
    ender(); return;
    console.log('in cp   i=' + i + '   j=' + j +
      '   after ender call and return for cp scope' +
      '   don\'t want this');
  }) // Promise
} // cp

它添加了递归,并在ender调用之后立即显示“ return”;它删除了lint识别出的无法访问的代码;一切都会顺利。

我有

function cp starting         i=0   j=0   want this
function cp ender starting   i=0   j=0   want this
function cp starting         i=1   j=0   want this
function cp ender starting   i=1   j=0   want this
function cp starting         i=2   j=0   want this
function cp ender starting   i=2   j=0   want this
in cp   resolving   i=3   j=0      want this
in cp   i=2   j=0   in ender after return, resolve, and callback   don't want this
in cp   resolving   i=2   j=0      want this
in cp   i=1   j=0   in ender after return, resolve, and callback   don't want this
in cp   resolving   i=1   j=0      want this
in cp   cp(2, 0)     result=done   want this
in cp   cp(1, 0)     result=done   want this
function cp result   result=done   want this

那是我期望得到的,除了//#3可以打印,是因为该语言无法识别所有可能性都被回调块中的“拒绝”或“解决”所覆盖。它继续执行不明智地放置在该位置的命令。

这些代码位是我仍然遇到问题的程序的模型。很快,我希望能够为其他令我惊讶的行为建模。

在更一般的层面上:初次接触Promises的人经常不了解Promises吗?我们如何有更高的信心来适当控制执行流程?在此详细级别上,哪些资源特别有用以进行解释?我会很感激在这个更一般的水平上的任何建议。

提前致谢 ...

安德烈·波波夫(Andrey Popov)

这里真正的答案是拒绝决心简单的回调,并标记拒绝/诺言的决心。他们不修改原始JavaScript的工作方式,这是您的假设“我不希望在ender调用之后进行控制台调用,因为ender(//#2)毕竟解决了Promise,实际上这是所有ap范围;退出promise并退出ap也就不足为奇了。

打电话rejectresolve简单地表示您将兑现承诺。这并不意味着您执行此操作的功能将立即退出。因此,请确定您是否要这样做return

下一个示例也是如此:

if (i < reps) {
    cp(i, j)
    .then(...)

    console.log(... // you DON'T want this
}

是的,可以肯定的是,即使您不想要它也可以得到它。您创建了一个if语句,您在其中做了一些Promise魔术,然后使用console.log因此,JavaScript不在乎它是否是Promise,它只是一个接一个地执行事情。

如果您阅读了更多有关Promises的内容,您将了解它们是纯JavaScript,并且try-catch内部包含有Promises,因此,如果引发错误,则他们可以捕获该错误并调用失败回调(通常随一起提供.catch(function(err){}))。

再次-承诺不会修改JavaScript的工作方式!您所说的一切都是非常合乎逻辑的,确实应该以这种方式发生。这是因为您希望Promises阻止您的其他代码,这根本不会发生:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP详细信息和有关IP的信息

来自分类Dev

获取有关操作系统的详细信息

来自分类Dev

有关SGX加载的详细信息

来自分类Dev

如何查找有关FireMonkey的详细信息?

来自分类Dev

有关Python中@property的详细信息的问题

来自分类Dev

有关异步IO调用的更多详细信息

来自分类Dev

有关ubuntu touch的硬件要求的详细信息

来自分类Dev

获取有关网络位置配置的详细信息

来自分类Dev

如何获取有关“ sudo”失败的详细信息

来自分类Dev

Oracle:哪个SQL命令获取有关表的所有详细信息?

来自分类Dev

红帽看到所有进程和有关它们的详细信息

来自分类Dev

有什么方法可以获取有关GCM故障的更多详细信息?

来自分类Dev

有关ApplicationUnderTest.Launch()方法的fileName和AlternativeFileName参数的详细信息

来自分类Dev

异常可以自动提供有关其环境的详细信息吗?

来自分类Dev

通过Lua C API有关函数参数的详细信息

来自分类Dev

获取有关“ System.Runtime.Serialization.SerializationException”类型的首次机会异常的详细信息

来自分类Dev

如何获得有关protobuf解析期间生成的错误的更多详细信息?(C ++)

来自分类Dev

Haskell函数类型声明中有关括号的详细信息

来自分类Dev

如何找到有关PHPMyAdmin数据库的正确详细信息?

来自分类Dev

有关MVC 5的详细信息的注册用户列表

来自分类Dev

我可以抽象出有关模板化类的详细信息吗?

来自分类Dev

有关FFmpeg中使用的已过滤帧类型的详细信息

来自分类Dev

需要有关install4j error.log文件的详细信息

来自分类Dev

Silverstripe:成员个人资料-更新有关Frontend的详细信息

来自分类Dev

DynamoDB触发器(流+ Lambda):有关TRIM_HORIZON的详细信息吗?

来自分类Dev

如何获取有关jquery ajax错误的更多详细信息?

来自分类Dev

多级分页中有关分页表遍历的详细信息

来自分类Dev

如何使用kubectl了解有关先前推出的修订的更多详细信息?

来自分类Dev

如何获得有关维基页面还原编辑的详细信息?

Related 相关文章

  1. 1

    PHP详细信息和有关IP的信息

  2. 2

    获取有关操作系统的详细信息

  3. 3

    有关SGX加载的详细信息

  4. 4

    如何查找有关FireMonkey的详细信息?

  5. 5

    有关Python中@property的详细信息的问题

  6. 6

    有关异步IO调用的更多详细信息

  7. 7

    有关ubuntu touch的硬件要求的详细信息

  8. 8

    获取有关网络位置配置的详细信息

  9. 9

    如何获取有关“ sudo”失败的详细信息

  10. 10

    Oracle:哪个SQL命令获取有关表的所有详细信息?

  11. 11

    红帽看到所有进程和有关它们的详细信息

  12. 12

    有什么方法可以获取有关GCM故障的更多详细信息?

  13. 13

    有关ApplicationUnderTest.Launch()方法的fileName和AlternativeFileName参数的详细信息

  14. 14

    异常可以自动提供有关其环境的详细信息吗?

  15. 15

    通过Lua C API有关函数参数的详细信息

  16. 16

    获取有关“ System.Runtime.Serialization.SerializationException”类型的首次机会异常的详细信息

  17. 17

    如何获得有关protobuf解析期间生成的错误的更多详细信息?(C ++)

  18. 18

    Haskell函数类型声明中有关括号的详细信息

  19. 19

    如何找到有关PHPMyAdmin数据库的正确详细信息?

  20. 20

    有关MVC 5的详细信息的注册用户列表

  21. 21

    我可以抽象出有关模板化类的详细信息吗?

  22. 22

    有关FFmpeg中使用的已过滤帧类型的详细信息

  23. 23

    需要有关install4j error.log文件的详细信息

  24. 24

    Silverstripe:成员个人资料-更新有关Frontend的详细信息

  25. 25

    DynamoDB触发器(流+ Lambda):有关TRIM_HORIZON的详细信息吗?

  26. 26

    如何获取有关jquery ajax错误的更多详细信息?

  27. 27

    多级分页中有关分页表遍历的详细信息

  28. 28

    如何使用kubectl了解有关先前推出的修订的更多详细信息?

  29. 29

    如何获得有关维基页面还原编辑的详细信息?

热门标签

归档