Javascript 承诺如何处理即时解决?

Javascript 承诺如何处理即时解决?,javascript,promise,Javascript,Promise,尝试承诺,发现了一些我没有预料到的东西 功能延迟器(时间){ 返回新承诺((解决、拒绝)=>{ 如果(时间!=0){ setTimeout(()=>解析(“等待”+(时间/1000)+“秒!”),时间) } 否则{ 决心(“没有时间等待”); } }) } var output=“承诺尚未解决!”; 控制台日志(输出); Delayer(10).then(函数(msg){output=msg;console.log(output)}); 控制台日志(输出)//这在回调之前不会改变。 Delay

尝试承诺,发现了一些我没有预料到的东西

功能延迟器(时间){
返回新承诺((解决、拒绝)=>{
如果(时间!=0){
setTimeout(()=>解析(“等待”+(时间/1000)+“秒!”),时间)
}
否则{
决心(“没有时间等待”);
}
})
}
var output=“承诺尚未解决!”;
控制台日志(输出);
Delayer(10).then(函数(msg){output=msg;console.log(output)});
控制台日志(输出)//这在回调之前不会改变。
Delayer(0).then(函数(msg){output=msg;console.log(output)});

控制台日志(输出)承诺规范要求它们始终异步调用回调,即使承诺已处于已解析状态。这是一个非常有益的质量,因为您可以确保代码始终以相同的顺序执行,无论是否需要等待。如果承诺有时会同步调用回调,那么执行顺序将取决于承诺的内部状态,可能会导致错误

具体请参见以下文件的要求2.2.4:

在执行上下文堆栈仅包含平台代码之前,不得调用
onCompleted
onRejected


承诺的规范要求它们始终异步调用回调,即使承诺已经处于已解析状态。这是一个非常有益的质量,因为您可以确保代码始终以相同的顺序执行,无论是否需要等待。如果承诺有时会同步调用回调,那么执行顺序将取决于承诺的内部状态,可能会导致错误

具体请参见以下文件的要求2.2.4:

在执行上下文堆栈仅包含平台代码之前,不得调用
onCompleted
onRejected


如果您接受异步,那么请实际接受它。不要试图区分你认为异步的函数,因为它可能是即时的。处理它们的方法与处理未知时间内解决的问题的方法相同。我创建此示例只是为了突出显示此功能。我不希望这会对我的代码造成问题,只是想知道它是如何工作的。我本来以为这会引起一个问题,但事实证明我错了。如果你接受异步,那就接受它。不要试图区分你认为异步的函数,因为它可能是即时的。处理它们的方法与处理未知时间内解决的问题的方法相同。我创建此示例只是为了突出显示此功能。我不希望这会对我的代码造成问题,只是想知道它是如何工作的。我本来以为这会引起问题,但事实证明我错了。非常感谢。它是如何做到这一点的?(或者这是一个我不应该担心的问题吗?)Masters@GreenFox基本上,
.then
函数中的代码表示
if(isAlreadyResolved){setImmediate(()=>callback())}
而不是
if(isAlreadyResolved){callback()}
谢谢。它是如何做到这一点的?(或者这是一个我不应该担心的问题吗?)Masters@GreenFox基本上,
.then
函数中的代码表示
if(isAlreadyResolved){setImmediate(()=>callback())}
而不是
if(isAlreadyResolved){callback()}