javascript - 将 then 附加到调用堆栈下多级 promise 的最佳解决方案是什么?

标签 javascript es6-promise callstack

考虑这样一个场景:

function func_topmost(){
    ...
    func_layer1();
    pseudo_code for some actions here; // an action that needs to run AFTER the promise in func_layer2 fulfilled.
}

function func_layer1(){
    ...
    func_layer2();
}

function func_layer2(){
    var the_vital_promise = $.post('very_slow_backend_response', data);
    return the_vital_promise;
}

以上只是一个例子。实际上,调用栈可能更深,并且在未来的开发中总是有可能将另一层函数引入调用栈。

我的问题是,确保最顶层的操作依赖于正确附加的底层 promise 的履行,最佳实践是什么?

现在我可以考虑让调用链中的所有函数 async function 一直到底部。我不确定这是否是正确的解决方案,并且它使后期维护非常僵化。

最佳答案

因此,您有多个正常函数相互调用,突然之间,堆栈顶部的函数恰好处理一些异步任务,您正在寻找一种方法来以最少的代码更改解决问题。我知道有 3 种方法可以处理这个问题,其中 2 种已经被提到,但我认为它们有一些缺点。

<强>1。返回 promise

  • 会破坏代码结构
  • 需要改变所有功能

<强>2。异步/等待

async function func_topmost(){
    const data = await func_layer1();
    pseudo_code for some actions here; // an action that needs to run AFTER the promise in func_layer2 fulfilled.
}

function func_layer1(){
    const promise = func_layer2();
    return promise;
}

function func_layer2(){
    var the_vital_promise = $.post('very_slow_backend_response', data);
    return the_vital_promise;
}
  • 与返回 promise 相比,代码更改更少,但编译包中的代码更多
  • 需要改变所有功能

<强>3。派发事件

如果您堆叠了许多函数,这对我来说似乎是处理问题的最佳方式。如果您在 Node 上,则可以使用事件库;如果环境是浏览器,则可以使用自定义 DOM 事件。这样您只需更改第一个和最后一个函数(如果中间的函数不依赖于 promise 完成)并且代码结构保持不变。

function func_layer2(){
    var the_vital_promise = $.post('very_slow_backend_response', data)
    .then(res => {
         events.emit('customEvent');
     });
    return the_vital_promise;
}

function func_topmost(){
    ...
    events.on('customEvent', () => {
         pseudo_code for some actions here; // an action that needs to run AFTER the promise in func_layer2 fulfilled.
    });
    func_layer1();
}

关于javascript - 将 then 附加到调用堆栈下多级 promise 的最佳解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51231569/

相关文章:

javascript - 更改后重新加载 DOM

javascript - 使用 PolyLines 通过 FabricJS 连接拖放形状

javascript - 尝试理解 ES6 Promise : executing three setIntervals sequentially

javascript - 使用过滤器返回 Promise.all 的 promise 数组不起作用

gdb - 如何确定 gdb 中的函数属于哪个共享库?

javascript - 高效的调用堆栈中断技术

javascript - 防止元素添加属性

javascript - Velocity.js/Blast.js 从 0 开始不透明度

node.js - Promise.all 遭到未处理的拒绝

c - VC++中栈的大小是多少?