按顺序执行操作

时间:2018-03-27 18:58:41

标签: javascript node.js

我知道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]

我知道这可能是一个非常愚蠢的错误,但我几个小时以来一直在迷失它

问题是:为什么会发生?如何确保在两种情况下打印对象? (即如何在打印前等待功能完成)

2 个答案:

答案 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函数中的值。