这些场景与调用堆栈有什么区别?
方案1:
function A(){//doStuff};
function B(){//doStuff};
方案2:
function A(){//doStuff};
window.setTimeOut(function B(){//doStuff}, 5000);
方案3:
function A(){//doStuff}.then(function B(){//doStuff});
我正在与某人讨论一个错误,他们建议我只是将setTimeOut添加到第二个函数并等待它是否会触发。我正在使用一个承诺A +库,我想知道是否可以将一个承诺附加到第一个函数并在函数A完成时触发第二个函数。
此外,我不确定setTimeOut和promise的主要区别是与第一个场景相比。我知道promises和timeout将函数移动到调用堆栈的末尾但是我不确定在那个点之后会发生什么以及与场景1有什么不同。任何信息都将受到赞赏。
答案 0 :(得分:2)
我想知道是否可以在第一个函数附加一个promise并在函数A完成后触发第二个函数。
通过挂钩函数的返回值来承诺工作。一个函数返回一个promise,你可以依赖它。 JavaScript没有公开任何方法来检测函数何时完成执行。例如,如果你有一个API:
api.someAsyncThing(); // does not return a promise
没有办法知道函数何时完成运行,除非它暴露了副作用,在这种情况下你可以在setInterval内部进行轮询并创建一个promise - 虽然这非常hacky。
此外,我不确定setTimeOut与承诺的主要区别在于与第一个场景的对比。
setTimeout
引入了超时,A很可能无法在超时内完成,B将在A完成嵌套回调之前开始运行。唯一的区别是它可能等待足够长的时间 - 这被称为race-condition。
答案 1 :(得分:0)
超时和承诺均以异步方式执行代码,但具有不同的特征和目的:
setTimeout -将功能执行延迟特定的持续时间。 -不阻止其余代码执行(异步行为) -他们创建Macrotask(浏览器内部操作)
承诺 -它们是允许异步执行代码的包装器(例如ajax调用)。 (不取决于特定的持续时间) -它们对于更改不同的异步调用特别有用。 -减少您使用await运算符的时间,不会阻塞其余的代码执行(异步行为)。 -他们创建了 Microtask (浏览器内部操作),其优先级高于 Macrotask 。
推荐
如果要延迟某个特定时间的函数执行,而又不阻塞进程中其余代码的执行,请使用 setTimeout
使用承诺: 当您想执行一些异步代码并避免“回调地狱”(是的,因为您可以在没有Promises的情况下进行异步ajax调用,但是语法不太清晰,更容易出错)