Node.js:在asynchronous调用之后,哪些代码部分被执行?

asynchronous调用是JavaScript的固有部分,使用callback通常是处理这些调用的优雅工具。

但是,我不太清楚在asynchronous操作之后分支代码是如何决定的。 例如,下面的代码会发生什么?

function f(callback) { value = some_async_call(); if (value) { callback(value); } return(value); } 

这里会发生什么? 从我短暂的JS经验, return将发回一个undefined值。 但是,假设该value从asynchronous调用返回true,callback是否被调用了正确的值或undefined值?

换句话说,在asynchronous调用之后立即执行哪些操作并将其推迟到返回值是否有规则?

之前我曾经尝试过什么

SFTW在javascript中分支asynchronous调用,但没有发现任何规范或决定性的。

更新:在底部的三种不同的方法之间增加了实际的差异

让我们假设some_async_call(); 被定义为asynchronous函数: async function some_async_call() { ... }

这个函数返回的是一个Promise ,这意味着value现在是一个promise: value.then( function(result) { } )

当我把它翻译成代码时:

 async function some_async_call() { if (theMoonIsInTheRightPosition) return Fetch('/api/data/') // this returns a promise as well. return false; } 

我现在可以做2件事情:

 function parentFunction(callback) { var promise = some_async_call(); promise.then( callback ); return ...; // you can't "return" the value of an async call synchronously, since it is a promise. } 

要么:

 async function asyncParentFunction( callback ) { var value = await some_async_call(); if (value) callback( value ); return value; } 

然而,这将父函数转换为asynchronous函数,这意味着该函数的立即返回值也是一个承诺。

长话短说:

您可以使用callback来通过asynchronousfunction,或承诺,或asynchronous/等待

callback

 function doStuff(callback) { // do asynchronous stuff var result = 100; callback(result); // once you're done with stuff } doStuff( function(data) { console.log('Im done!', data); } ); 

许诺

 function doStuff() { return new Promise(function(resolve, reject) { // do asynchronous stuff var result = 100; resolve(result); }); } doStuff.then(function(data) { console.log('Im done!', data); }); 

asynchronous/ AWAIT

 function doStuff() { return new Promise(function(resolve, reject) { // do asynchronous stuff var result = 100; resolve(result); }); } (async function() { // async/await only works in async functions. var data = await doStuff(); console.log('Im done!', data); })(); 

你可以看到:promise和async / await使用相同的机制,真的值得一读。

三者的区别的一个实际例子:

callback

 function fetchUserWithPosts(userId, callback) { fetchUser(userId, function(user) { fetchPostsByUserId(userId, function(posts) { callback({ user: user, posts: posts }); }); }); } 

许诺

 function fetchUserWithPosts(userId) { return Promise.all([ fetchUser(userId), fetchPostsByUserId(userId) ]).then(function(result) { return { user: result[0], posts: result[1] }; }); } 

asynchronous/ AWAIT

 async function fetchUserWithPosts(userId) { return { user: await fetchUser(userId), posts: await fetchPostsByUserId(userId); }; } 

你是对的, undefined将被退回。 在asynchronous操作之后执行逻辑,应该将callback传递给该函数。 你正试图以同步的方式使用代码, async/await来救援。 假设some_async_call returns Promise你可以写:

 async function f(callback) { var value = await some_async_call(); if (value) { callback(value); } return value; } 

在这种情况下,你的函数将返回值的Promise ,也将是asynchronous的。 在这里阅读更多。

甚至更多,你不需要传递callback。 您可以在客户端代码中await您的function并从那里执行callback。

关于分支,你可以不使用async/await分支的唯一方法是使some_async_call接受一个callback,接受value作为参数:

 function f(callback) { some_async_call(function(value) { if (value) { callback(value); } }); } 

再次重申,除了Promise之外,没有办法从async方法返回一个值。 或在RxJS中 Observable