【问题标题】:Is this an acceptable method of avoiding callback hell in old versions of node?这是在旧版本节点中避免回调地狱的可接受方法吗?
【发布时间】:2018-10-18 08:23:32
【问题描述】:

没有承诺,没有异步等我想知道这种模式是否可以接受 - 我的函数被调用并且我被传递了一个回调。我需要做两件事才能回电:

function doSomething(..args.., callbackThatNeeds1And2DoneFirst){

    var done1 = false;
    var res1 = someAsync1(function call1callback(){ 
      //blah
      done1 = true;

      maybeComplete();
    });

    var done2 = false;
    var res2 = someAsync2(function call2callback(){ 
      //blah
      done2 = true;

      maybeComplete();
    });

    function maybeComplete(){
      if(done1 && done2){
        callbackThatNeeds1And2DoneFirst();
      }
    }

}

我想问题是关于变量范围的 - 多个“并发”执行是否会相互干扰 done1 和 done2 的值,还是每个调用都有自己的变量范围?

【问题讨论】:

  • 除非我在这段代码中遗漏了一些东西,否则当您测试 done1 和 done2 时,由于异步调用,您肯定不会设置任何这些变量。
  • 你是对的,谢谢!已编辑..
  • 这应该可以。但是在这里,您让“本地”回调意识到他们不应该知道的更普遍的问题 (maybeComplete)。这在一些狭窄的情况下是可以接受的,但这不适用于应用范围。如果本地回调函数来自可能无法访问的其他地方怎么办?
  • 我在想 MaybeComplete 将在被调用的函数范围内(请参阅进一步编辑),但我没有做很多节点/js,所以我不太了解范围/您所指的距离
  • 这可能会起作用,但您最好创建一个简单的队列,始终将您的回调作为最终条目。每个函数都会接受一个next 参数,该参数将在其运行结束时被调用。首先填充您的队列,然后触发其中的第一个函数。

标签: javascript node.js scope asynccallback


【解决方案1】:

是的,这种模式很好。它基本上与Promise.all 今天所做的一样,只是它仅适用于两个异步回调,而不是可变数量。

多个“并发”执行是否会相互干扰done1done2 的值,或者每个调用都有自己的变量范围?

doSomething 的每次调用都会使用新的done1done2 变量创建一个新范围。

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多