承诺与功能 calls/setTimeOut

Promises vs function calls/setTimeOut

在调用堆栈方面,这些场景有什么区别?

场景 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 并等待它是否触发。我正在使用一个 promise A+ 库,我想知道是否可以将一个 promise 附加到第一个函数并在函数 A 完成时触发第二个函数。

我也不确定 setTimeOut 和 promise 与第一种情况的主要区别是什么。我知道 promises 和 timeouts 将函数移动到调用堆栈的末尾,但我不确定在那之后会发生什么,以及这与场景 1 有何不同。任何信息将不胜感激。

I am wondering if it is possible to just attach a promise to the first function and fire the second one when function A is done.

Promise 通过挂钩函数的 return 值来工作。一个函数 return 是一个 promise,反过来你可以挂钩。 JavaScript 没有公开任何方法来检测函数何时完成执行。因此,例如,如果您有一个 API:

api.someAsyncThing(); // does not return a promise

无法知道函数何时完成 运行 除非它暴露出副作用,在这种情况下,您可以在 setInterval 内部进行轮询并创建一个 promise - 虽然这非常 hacky。

Also I am not sure what the main difference of the setTimeOut and the promise would be vs the first scenario.

setTimeout 引入超时,很可能 A 不会在超时内完成,而 B 会在 A 完成嵌套回调之前 运行 开始。唯一的区别是它 可能 等待足够长的时间 - 这称为 .

TimeoutsPromises 都用于以异步方式执行代码,但具有不同的特性和目的:

设置超时 - 按特定持续时间延迟函数的执行。 - 不阻止其余代码执行(异步行为) - 他们创建 Macrotask(浏览器内部操作)

承诺 - 它们是允许异步执行代码的包装器(例如:ajax 调用)。 (不依赖于具体持续时间) - 它们对于更改不同的异步调用特别有用。 - 不会阻塞其余代码执行(异步行为),至少您正在使用 await 运算符。 - 他们创建 Microtask(浏览器内部操作),其优先级高于 Macrotask

推荐

  • 当你想延迟一个函数执行某个特定的持续时间并且不阻止进程中的其余代码执行时使用setTimeout

  • 使用承诺: 当您想执行一些异步代码并避免“回调地狱”时(是的,因为您可以在没有 Promises 的情况下进行异步 ajax 调用,但语法不太清晰且更容易出错)