回调金字塔是什么意思_什么是“回调地狱”,RX如何以及为什么解决它?

梵蒂冈之花

1)对于不了解javascript和node.js的人来说,什么是“回调地狱”?这另一个问题有一些Javascript回调地狱的示例:如何避免在Node.js中长时间嵌套异步函数Javascript中的问题在于,“冻结”计算并使“其余部分”(异步地)执行的唯一方法是将“其余部分”放入回调中。例如,假设我要运行如下代码:x = getData();y = getMoreData(x);z = getMoreData(y);...如果现在我想使getData函数异步,这意味着我有机会在等待其他代码返回值时运行一些其他代码,会发生什么情况?在Javascript中,唯一的方法是使用延续传递样式重写所有与异步计算有关的内容:getData(function(x){    getMoreData(x, function(y){        getMoreData(y, function(z){             ...        });    });});我认为我不需要说服任何人此版本比以前的版本丑陋。:-)2)什么时候(以哪种设置)发生“回调地狱问题”?当您的代码中有很多回调函数时!在代码中包含的代码越多,与它们的协作就越困难,而在需要执行循环,try-catch块之类的事情时,这种情况就变得尤为糟糕。例如,据我所知,在JavaScript中执行一系列异步函数的唯一方法是在递归函数之后运行一个异步函数。您不能使用for循环。// we would like to write the followingfor(var i=0; i<10; i++){    doSomething(i);}blah();相反,我们可能需要结束编写:function loop(i, onDone){    if(i >= 10){        onDone()    }else{        doSomething(i, function(){            loop(i+1, onDone);        });     }}loop(0, function(){    blah();});//ugh!我们在StackOverflow上收到的许多问题询问如何做这种事情,这证明了它是多么令人困惑:)3)为什么会发生?发生这种情况是因为在JavaScript中,延迟计算以使其在异步调用返回之后运行的唯一方法是将延迟的代码放入回调函数中。您不能延迟以传统的同步样式编写的代码,因此最终到处都有嵌套的回调。4)还是在单线程应用程序中也可能发生“回调地狱”?异步编程与并发有关,而单线程与并行性有关。这两个概念实际上不是一回事。您仍然可以在单个线程上下文中拥有并发代码。实际上,JavaScript是回调地狱的女王,是单线程的。并发和并行性有什么区别?5)您能否也请在该简单示例中说明RX如何解决“回调地狱问题”。我对RX一点都不了解,但是通常可以通过在编程语言中添加对异步计算的本机支持来解决此问题。实现可能有所不同,包括:异步,生成器,协程和callcc。在Python中,我们可以使用类似于以下内容的代码来实现该先前的循环示例:def myLoop():    for i in range(10):        doSomething(i)        yieldmyGen = myLoop()这不是完整的代码,但是其思想是“ yield”暂停我们的for循环,直到有人调用myGen.next()。重要的是,我们仍然可以使用for循环来编写代码,而不必像在递归loop函数中那样将逻辑“由内而外” 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值