Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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 修改创建和获取异步nodejs应用程序的详细分析_Javascript_Node.js_Asynchronous_Promise_Async Await - Fatal编程技术网

Javascript 修改创建和获取异步nodejs应用程序的详细分析

Javascript 修改创建和获取异步nodejs应用程序的详细分析,javascript,node.js,asynchronous,promise,async-await,Javascript,Node.js,Asynchronous,Promise,Async Await,为了更详细地介绍我的应用程序,我需要知道哪些承诺没有等待,但。。。js不提供这种能力 在python中,每次不等待异步函数的结果时,它都会打印 但是如何在js中获得这样的结果呢? 我得出结论,要这样做,我必须知道几件事: 如何覆盖承诺构造(添加状态字段,该字段将显示正在等待的承诺,并将超时设置为检查状态) 当对象等待时触发了什么(更改状态) 我通过代理发现,当等待时,对象的属性被调用: 异步功能测试(obj){ 等待obj } 测试(新代理(新对象(){ 获取(对象,名称){ log(“ge

为了更详细地介绍我的应用程序,我需要知道哪些承诺没有等待,但。。。js不提供这种能力

在python中,每次不等待异步函数的结果时,它都会打印 但是如何在js中获得这样的结果呢? 我得出结论,要这样做,我必须知道几件事:

  • 如何覆盖承诺构造(添加状态字段,该字段将显示正在等待的承诺,并将超时设置为检查状态)
  • 当对象等待时触发了什么(更改状态)
我通过代理发现,当等待时,对象的属性被调用:

异步功能测试(obj){ 等待obj } 测试(新代理(新对象(){ 获取(对象,名称){ log(“get”+name) } }) 但事实证明,这种情况只发生在非承诺对象上 所以当我尝试这样做时:

Promise.prototype.then=function(){
log(“当时被调用”)
}
测试(Promise.resolve({}))
我什么也没得到

与Promise.prototype.constructor和Promise.resolve相同:

让getOne=async()=>1
getOne()
getOne既不调用Promise构造函数也不调用Promise.resolve

那我做错了什么


async/await实际上是如何创建承诺并从承诺中获取价值的,以及它如何被重写?

我不认为重写是您想要的。通常async告诉node此函数是异步的,并且如果事件循环中有“长”的内容查询其他API或读取IO等过程,则这些函数将产生承诺。您也可以尝试使用以下方法:

returnnewpromise((resolve,reject)=>{…执行任务并根据预期的输出调用resolve()或reject()})

返回的值将是一个承诺。 要处理承诺,您需要等待它。 从
让getOne=async()=>1
您需要这样做

让getOne=async()=>返回新承诺((解析,拒绝)=>返回解析(1))

要稍后获得该值,您需要调用
wait getOne()

我通过代理发现,当等待时,对象的
属性被调用

事实上,这是正确的

当我尝试执行[…]
测试(Promise.resolve({}))
时,输出中没有任何结果

这是因为在这段代码中——与您之前对
await
的测试相反——您没有在这里执行
await
then
调用。您只是构造了一个承诺,并且您的代理对象没有捕获承诺的创建,只是执行
then
方法

这让我们回到您的第一个要点:

如何超越承诺建设

你不能


我们可以访问
Promise
构造函数,但是您无法捕获它的执行。如果您使用
construct
处理程序为它创建代理,则不会调用它,因为JavaScript引擎仍然会引用原始的
Promise
构造函数,例如,当使用
async
函数时操作已执行。因此您在这里没有希望。

您也可以使用getOne()。然后(data=>…执行操作);在这种情况下,数据基本上不会包含第一位的内容。您想解决什么实际问题?在使用node.js时,您需要进行研究。不要试图覆盖承诺构造函数或方法-它无论如何对
async
函数创建的承诺都不起作用。