Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript和Python承诺/等待评估之间的差异_Javascript_Python_Concurrency_Promise_Async Await - Fatal编程技术网

JavaScript和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

在Python的背景下,我一直在尝试学习JS并发模型

在Python中运行以下命令:

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()