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
。