为什么我的异步/等待功能异常?;(Javascript)
这是我的Javascript代码。我想结果是12345 异步函数fn1(){ 控制台日志(1); 等待fn2(); 控制台日志(3); }; 异步函数fn2(){ 控制台日志(2); }; fn1(); 新承诺((解决、拒绝)=>{ 控制台日志(4) 解决() }).然后(()=>{ 控制台日志(5) })为什么我的异步/等待功能异常?;(Javascript),javascript,Javascript,这是我的Javascript代码。我想结果是12345 异步函数fn1(){ 控制台日志(1); 等待fn2(); 控制台日志(3); }; 异步函数fn2(){ 控制台日志(2); }; fn1(); 新承诺((解决、拒绝)=>{ 控制台日志(4) 解决() }).然后(()=>{ 控制台日志(5) }) //函数声明 异步函数fn1(){ 控制台日志(1); wait fn2();//等待异步函数fn2(在线程3上调度)=>所以console.log(2)应该按时间顺序在这里 控制台日志(
//函数声明
异步函数fn1(){
控制台日志(1);
wait fn2();//等待异步函数fn2(在线程3上调度)=>所以console.log(2)应该按时间顺序在这里
控制台日志(3);
};
异步函数fn2(){
控制台日志(2);
};
//线程1启动(实际执行代码)
fn1();//因为fn1是异步的,所以它在线程2上被调度
新承诺((解决、拒绝)=>{
控制台日志(4)
resolve()//触发器()=>{console.log(5)}
})//承诺声明
.然后(()=>{
控制台日志(5)
})//立即执行承诺
问题是JS代码本质上是异步的。因此,在执行“3”打印之前,它已经触发了其他指令,并且这些指令在该结束之前结束。上述fn1()和new Promise()的执行是异步执行的,这就是指令顺序独立的原因。如果您希望获得所需的结果,可以尝试以下代码:
async function fn1 () {
console.log(1);
await fn2();
console.log(3);
};
async function fn2 () {
console.log(2);
};
async function makeExectionOrder(){ // move the blocks into asynch function
await fn1(); // make synchrounous call
new Promise((resolve, reject) => {
console.log(4)
resolve()
}).then(() => {
console.log(5)
})
}
makeExectionOrder()
您必须了解堆栈和队列: 更多信息:堆栈和队列或 执行
newpromise(fnResolvingOrRejecting)
时,会立即调用函数fnResolvingOrRejecting
,因此它位于同一堆栈上。还没有排队
如果您理解了什么是堆栈和队列,就可以更好地解释代码,省去令人困惑的异步和等待语法
一旦您了解了它的实际功能,语法将真正改善代码,但在本例中,我将省略它,以便您可以看到作为回调/结果处理程序执行的代码以及堆栈上的代码
function fn1 () {
console.log(1);//on the same stack as calling fn1
fn2()//executing fn2
.then(//first queued
() => console.log(3)
);
};
function fn2 () {
return new Promise(
(resolve)=>{
console.log(2);//on the same stack as calling fn1
resolve();
}
);
};
fn1();//calling fn1 immediatly logs 1 and 2 because they are on the same stack
new Promise((resolve, reject) => {
//after calling fn1 and queing console.log(3) this is executed because it's on
// the same stack
console.log(4)
resolve()
}).then(() => {//second queued
console.log(5)
})
似乎console.log(3)在下一个刻度中。为什么“3”应该出现在“4”之前?我们使用async/await,以便解决异步问题。异步函数init(){//代码同上//但是await fn1()}init()如果我使用函数调用这些,我的结果是1 2 3 4 5。这是为什么?@XuYoung那只是因为你在等待执行
fn1()
之后才对Promise
@XuYoung做任何事情。我编辑了我的评论。如果您在编辑之前看到了上一个,我的错误将导致混乱await
仅在async
函数中有效。因此,无论如何,如果执行async function init(){//codes同上//但等待fn1()}init()
,线程1将等待fn1()
(已调度到线程2)完成,这将使线程2中的console.log(1)//(2) //在线程3中
fn1()。然后()=>new Promise…console.log(4).
谢谢,非常有用。