javascript async/await实际上是如何工作的?
我有一些使用javascript async/await的代码:javascript async/await实际上是如何工作的?,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我有一些使用javascript async/await的代码: function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function fun1() { console.log("dosomething1"); await sleep(6000); console.log("dosomething2"); return "ret
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function fun1()
{
console.log("dosomething1");
await sleep(6000);
console.log("dosomething2");
return "returnfromfun1";
}
console.log(fun1());
console.log("hello");
根据关于异步/等待的说明:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function fun1()
{
console.log("dosomething1");
await sleep(6000);
console.log("dosomething2");
return "returnfromfun1";
}
console.log(fun1());
console.log("hello");
异步函数可以包含暂停函数的等待表达式
执行异步函数并等待传递的承诺
解析,然后恢复异步函数的执行和
返回已解析的值
我期望得到以下结果:
dosomething1
//wait for 6 seconds
dosomething2
Promise { <state>: "fulfilled", <value>: "returnfromfun1" }
hello
dosomething1
//等待6秒钟
dosomething2
承诺{:“履行”,:“从Fun1返回”}
你好
但实际产出是:
dosomething1
Promise { <state>: "pending" }
hello
//wait for 6 seconds
dosomething2
dosomething1
承诺{:“待定”}
你好
//等待6秒钟
dosomething2
fun1似乎在“等待”线上返回。我是否误解了官方文件中的描述?我似乎从未得到fun1的返回值(“returnfromfun1”) 您必须以稍微不同的方式阅读引用的部分: 异步函数可以包含一个等待表达式,用于暂停异步函数的执行 只是异步函数本身暂停执行,然后调用它的函数继续执行 如果您想到一个同步调用堆栈,那么会出现异步函数上下文弹出并存储在其他地方的情况:
stack: [init] -> [async] fun1 -> sleep -> setTimeout
// The promise gets returned from sleep
stack: [init] -> [async] fun1
// The async function gets popped of
stack: [init]
hidden: [async] fun1
// synchronous execution ends
stack: -
hidden: [async] fun1
// the timer triggers, the promise gets resolved
stack: setTimeout callback
hidden: [async] fun1
// synchronous execution ends
stack: -
hidden: [async] fun1
// the promise resolves, the async fun1 context gets moved onto the stack
stack: [async] fun1
fun1似乎在“等待”线上返回
是的,没错。在那一刻,它返回一个承诺,该承诺在异步函数返回时解析(在它继续执行之后)
我似乎从未得到fun1的返回值(“returnfromfun1”)
当承诺解决时,您可以得到:
fun1().then(result => console.log(result));
fun1
是异步的,所以只需使用console.log(fun1())调用它即可
不会等待它的解决-或者等待它,或者调用。然后“根据官方文件”
在它上面-这是一个任何人都可以编辑的wiki,而不是官方文件。这里有官方文档:异步函数返回承诺。调用函数会立即同步返回未解析的承诺。承诺的结果可以在.then()
中检索,例如fun1。然后((result)=>{}
或者通过等待它,例如var result=wait fun1()
。啊哈,那个文档太正式了,让我头痛,甚至只是瞥了一眼:)@jonaswillms这么认为,这几乎是一样的事情-var result=foo()代码>(在另一个问题中)不会等待异步操作完成,就像console.log(fun1())代码>这里不等待异步操作完成,尽管我猜还有@jonaswillms,你是说从fun1 at wait返回的Promise对象是在sleep函数中创建的吗?您是否可以指向一个授权文档,其中声明await将从当前异步函数返回,且函数创建的Promise对象位于await关键字之后?@william no,fun1
将在内部创建一个Promise并返回该承诺。唯一的“权威文件”是规范,当然我可以引用相关部分,但我不认为这将有助于你目前的理解阶段(规范真的很难阅读),即使承诺不是由睡眠创造的,它一定是一个副本,对吗?因为承诺会在6秒后解决。不。当sleep()
返回的承诺解析时,异步函数继续执行return
s,并在内部解析该内部承诺。所以他们不是彼此的“复制品”。现在感觉好多了。非常感谢,乔纳斯威尔斯!