我知道99%是一个非常愚蠢的问题,但我刚刚开始使用javascript和node.js。
以下是代码,稍后我会解释这个问题:
function f(args){
request.post({stuff},
function optionalCallback(error, response, body) {
if (error) {
console.log('upload failed:', error);
}
console.log(JSON.parse(body)); // #2
return JSON.parse(body);
});
}
// later on in the code, in a switch statement
case 'test':
console.log(f(args)); // #1
break;
以下是我遇到的问题:console.log()#1打印出undefined,而console.log#2打印出预期的输出,但在#1之后(如,半秒钟后)
#1 undefined
#2 [object Object]
我知道这可能是一个非常愚蠢的错误,但我几个小时以来一直在迷失它
问题是:为什么会发生?如何确保在两种情况下打印对象? (即如何在打印前等待功能完成)
答案 0 :(得分:2)
节点“异步”工作,不像C ++,python这样的“同步”语言。当你在console.log中f(args)
时,一个单独的事件循环将开始使用你的函数。
将其视为“理解”的单独主题。
---{function call here}--->console.log #1 ( I called a function, it returned nothing)
\
\
inside the function ---{post}--->
\
\
-----{response here}---->
\
\
-------> console.log #2 successfull
你想要像
这样的东西---{function call here}-----------------{response here} -> console.log now
^
\ \
\ \
inside the function ---{post}---> \
\ \
\ \
-----{response here}---->
\
\
-------> console.log #2 successfull
答案 1 :(得分:1)
//稍后在代码中,在switch语句中
这是你的第一个错误;)
switch语句中的代码不会在“函数之后”执行。这是调用函数f(args)
。
其次,function f(args)
在调用时不会返回值:因此调用者将收到undefined
。
return
中有function f
语句这一事实并不意味着函数本身会返回一个值,只是函数(function f
)将接收嵌入式optionalCallback
函数中的值。