Javascript 那么,如何进行异步呢?

Javascript 那么,如何进行异步呢?,javascript,promise,async-await,Javascript,Promise,Async Await,基本上,我正在尝试在JS中了解更多的async/await和promise。我正在努力使你好介于之间完成和第三次完成。所以最好的猜测是,先做第二个,然后做第二个asnyc,然后等待console.log('Hello')。我在下面尝试了两种方法,但都没有达到预期效果 接近A let promise=新承诺((res,rej)=>{ res(); }); 答应。然后(()=>{ console.log('finished!') }).然后(()=>{ setTimeout(异步函数(){ wait

基本上,我正在尝试在
JS
中了解更多的
async/await
promise
。我正在努力使你好介于之间完成第三次完成。所以最好的猜测是,先做第二个
,然后做第二个
asnyc,然后等待
console.log('Hello')
。我在下面尝试了两种方法,但都没有达到预期效果

接近A
let promise=新承诺((res,rej)=>{
res();
});
答应。然后(()=>{
console.log('finished!')
}).然后(()=>{
setTimeout(异步函数(){
wait console.log(“Hello”);},3000);//设置超时级别的异步/wait
}).然后(()=>{
console.log('third finish!!')

})
您需要将第二部分作为一个
承诺
,并从
返回它。然后
以便它正确地链接在第一部分和第三部分之间
setTimeout
不返回
Promise
,您必须显式构造
Promise

let promise=新承诺((res,rej)=>{
res();
});
答应。然后(()=>{
console.log('finished!')
}).然后(()=>{
返回新承诺(解决=>{
setTimeout(函数(){
console.log(“你好”);
解决();
}, 1000);
});
}).然后(()=>{
console.log('third finish!!')

})
您需要将第二部分作为一个
承诺
,并从
返回它。然后
以便它正确地链接在第一部分和第三部分之间
setTimeout
不返回
Promise
,您必须显式构造
Promise

let promise=新承诺((res,rej)=>{
res();
});
答应。然后(()=>{
console.log('finished!')
}).然后(()=>{
返回新承诺(解决=>{
setTimeout(函数(){
console.log(“你好”);
解决();
}, 1000);
});
}).然后(()=>{
console.log('third finish!!')

})
另一种方法是编写一个异步
setAsyncTimeout
函数(该函数尚未经过彻底测试,可能需要调整):


通过您的示例进行测试:
通过您的示例进行测试(另一个承诺):
例如:
另一种方法是编写一个异步
setAsyncTimeout
函数(该函数尚未经过彻底测试,可能需要调整):


通过您的示例进行测试:
通过您的示例进行测试(另一个承诺):
例如:
await console.log
没有意义,因为a)console.log是同步的,b)它无论如何都不会返回承诺-至于你的问题,
的结果保证是承诺的,因此,根据定义是异步的
await console.log
没有意义,因为a)console.log是同步的,b)无论如何它不会返回一个承诺-至于你的问题,
的结果保证是一个承诺,因此,定义是异步的。如果我理解错误,请纠正我,但在我看来,它的基本工作原理与@CertainPerformance的答案完全相同?@Isaac我们的名字会让旁观者感到困惑。是的,结果是一样的,这只取决于你是想重构代码,还是内联setTimeout很简单。如果我理解错误,请纠正我,但在我看来,它的工作原理与@CertainPerformance的答案完全相同?@Isaac我们的名字会让旁观者感到困惑。是的,结果是一样的,这只取决于您是想重构代码还是内联setTimeout足够简单
async function setAsyncTimeout(callback, interval) {
    return new Promise( (resolve, reject) => {
        setTimeout(() => {
            try {
                let inner = callback()
                if (inner && inner.then) {
                    inner.then(resolve, reject)
                } else {
                    resolve(inner)
                }
            } catch(e) {
                reject(e)
            }
        }, interval)
    })
}
let promise = new Promise((res,rej)=>{
  res();
});

promise.then(() => {
  console.log('finished!')
}).then( setAsyncTimeout(function(){     
    console.log("Hello"); }, 3000); 
}).then(() => {
  console.log('third finish!!')
})
let promise = new Promise((res,rej)=>{
  res();
});

promise.then(() => {
  console.log('finished!')
}).then(async () => { //async/await at thenlevel
  await setAsyncTimeout(function(){     
    console.log("Hello");
    return setAsyncTimeout(() => console.log("world"), 3000)
  }, 3000); 
}).then(() => {
  console.log('third finish!!')
})
let promise = new Promise((res,rej)=>{
  res();
});

promise.then(() => {
  console.log('finished!')
}).then(() => {
  return setAsyncTimeout(() => { console.log("Hello"); }, 3000)
}).then(() => {
  console.log('third finish!!')
})