JavaScript和Python承诺/等待评估之间的差异
在Python的背景下,我一直在尝试学习JS并发模型 在Python中运行以下命令:JavaScript和Python承诺/等待评估之间的差异,javascript,python,concurrency,promise,async-await,Javascript,Python,Concurrency,Promise,Async Await,在Python的背景下,我一直在尝试学习JS并发模型 在Python中运行以下命令: async def myFunction(): print("abc") myFunction() 不会打印任何内容。在JavaScript中运行以下命令: async function myFunction() { console.log("abc") } myFunction() 将打印“abc”。在这两种情况下,我没有等待myFunction
async def myFunction():
print("abc")
myFunction()
不会打印任何内容。在JavaScript中运行以下命令:
async function myFunction() {
console.log("abc")
}
myFunction()
将打印“abc”。在这两种情况下,我没有等待myFunction
,但评估结果不同
我理解Python程序为什么不打印任何内容myFunction
是一个解析为nothing的协同例程函数,更具体地说,它返回一个可等待的[None]
。但要真正执行这个可等待的副作用,我必须等待它
我也读到了答案为“否”的文章,谈到如何保证对承诺的热切评价
尽管我已经分别研究了这两种并发模型,但它们的区别仍然令人困惑。虽然这里关于对比的一般清晰性将非常有帮助,但我也有一个具体的问题:在JavaScript中等待一个不解决任何问题的
承诺
,并且应该只执行它的副作用,这有什么意义吗?换句话说,await myFunction()
和myFunction()
在不同的情况下是否可能有不同的行为,即使它们在这里给出相同的输出?在异步函数中,所有异步操作都是通过在其前面使用await来完成的
如果承诺前面有一个wait,那么我们将等待异步操作完成,然后继续执行剩余的代码
如果在异步操作之前不使用wait,我们就不会解析承诺并继续
在同步操作前等待无效
// Case I
const test = async() => {
let res = fetch("http://localhost:3000");
console.log(res);
console.log("It is working");
// We dont wait for the http request to complete,
// We print res as a <<promise>>
// and continue to the next line and print "It is working".
}
test();
// Case II
const test = async() => {
let res = await fetch("http://localhost:3000");
console.log(res);
console.log("It is working");
// We wait for the http request completion.
// After that we print the result.
// Then print ===> It is working
}
test();
()=> {} // stands for an anonymous function also know as Fat arrow function.
async def myFunction():
打印(“abc”)
waitiable=myFunction()
在Python中,myFunction()
返回一个可等待的函数。代码还没有运行。仅当您在可等待的服务器上执行方法(.send()
)时,它才会运行:
可等待。发送(无)
通常不使用.send()
,这些机制是隐藏的。您只需使用wait myFunction()
或asyncio.get\u event\u loop()。运行直到完成(myFunction())
,这将在后台执行函数的代码
在JavaScript中,异步函数返回一个承诺。MDN JS参考:
JavaScript中的承诺表示已经发生的过程
因此,当您在JavaScript中调用异步函数时,函数的代码开始运行,在某个点上返回一个承诺。以下是MDN JS参考的内容:
异步函数体可以被认为是由零个或多个等待表达式分割的。顶层代码同步运行,直到并包括第一个等待表达式(如果有)。这样,没有等待表达式的异步函数将同步运行。但是,如果函数体中存在等待表达式,则异步函数将始终异步完成
考虑到所有这些,我不明白如果您只想看到异步JS函数的副作用,为什么还要等待它(除非调用方需要副作用在继续之前发生)。我对Python的方法不太了解。。。对于JS方式:
wait myFunction()
和myFunction()
将始终以相同的方式计算myFunction()
。唯一的区别是对于调用方,只有在一种情况下等待承诺得到解决。您可以(例如,承诺何时执行)
const test = () => {
return fetch("http://localhost:3000");
}
let testingAsynFunc = async() => {
let a = await test();
//Here we wait until the promise is resolved and then continue the code execution.
console.log(a);
console.log("working");
}
testingAsyncFunc()