节点在asynchronous函数完成之前退出
我有一个函数返回一个承诺,我试图从一个asynchronous函数中等待它。 问题是程序立即完成,而不是等待承诺。
asynchronoustest.js:
function doItSlow() { const deferred = new Promise(); setTimeout( () => { console.log( "resolving" ); deferred.resolve(); }, 1000 ); return deferred; } async function waitForIt( done ) { console.log( "awaiting" ); await doItSlow(); console.log( "awaited" ); done(); } waitForIt(() => { console.log( "completed test" ); }); console.log( "passed by the test" );
构build并运行:
babel --stage 0 --optional runtime async-test.js > at.js && node at.js`
结果:
awaiting passed by the test
立即解决,而不是等待一秒钟没有影响:
function doItSlow() { const deferred = new Promise(); console.log( "resolving" ); deferred.resolve(); return deferred; }
有趣的是,“解决”从来不会被打印,即使它现在是同步的:
awaiting passed by the test
我会怀疑编译器的问题,但我检查了Babel的输出,果然,它编译了同步版本。
我以为我可以等待一个asynchronous函数的承诺。 有什么我在这里失踪?
您没有使用Promise
(假设它符合标准)。 它没有resolve
方法。 你应该传递一个函数:
function doItSlow() { return new Promise(resolve => { setTimeout( () => { console.log( "resolving" ); resolve(); }, 1000 ); }); }