2016-04-21 109 views
2

所以...我最近遇到了这个节点模块:async。我只需要针对我下面的情况做一点“展示并告诉”或最佳实践方法。在下面你可以看到我的功能GetBearerToken,它的参数{bearer_token:token}没有问题。利用异步NPM模块

我的问题是变量ss。我想在此函数之外使用它,并将其传递给另一个函数来执行某些操作。当然,当我尝试访问ss时,它是未定义的。我已经尝试了一些如文档中指出的那样进行这项工作的方法,但我显然错过了一些东西。因此,任何帮助将是巨大的...谢谢

GetBearerToken({ 
     bearer_token: token 
    }, function(error, result) { 
     if (error) throw error; 
     if (result) { 
     var resultset 
     var i; 
     for (i = 0; i < result.length; i++) { 
      resultset = (simpleObjectify(result[i].meta, result[i].rows)) 
     } 

     var jstring = JSON.stringify(resultset); 
     var obj = JSON.parse(jstring); 
     var ss = obj[0].uuid; 
     console.log(ss) 
     }) 

的功能ss外面是undefined

+0

谢谢Seth的编辑,非常感谢。 –

回答

1

首先阅读本

What is the scope of variables in JavaScript?


您可以尝试使用.waterfall方法

瀑布(任务,[回调])

运行的任务阵列功能串联,每一个都通过ir 结果到数组中的下一个结果。但是,如果任何任务将 错误传递给其自己的回调,则不会执行下一个函数,并且主回调将立即被调用并返回错误。

一个例子给你所要完成

async.waterfall([ 
     function(callback) { 

     GetBearerToken({ 
       bearer_token: token 
      }, function(error, result) { 
       if (error) throw error; 
       if (result) { // *note* don't forget to handle the result properly if an error occurs or the result is not what you expected. 
       var resultset 
       var i; 
       for (i = 0; i < result.length; i++) { 
        resultset = (simpleObjectify(result[i].meta, result[i].rows)) 
       } 

       var jstring = JSON.stringify(resultset); 
       var obj = JSON.parse(jstring); 
       var ss = obj[0].uuid; 
       callback(null, ss); // call the next callback in waterfall with ss value 
       } 
      ) 
      }, 
      function(arg1, callback) { 
      // arg1 now equals ss value 
      callback(null,'all completed'); 
      } 
     ], 
     function(err, result) { 
     // result now equals 'all completed' 
     }); 

什么,但因为上面的代码似乎已经是一步走向错误的方向,当 来调试。但看看.waterfall的例子,它分解了回调,然后调用.waterfall方法。

+0

谢谢GeoPhoenix的建议。我继续清理代码并考虑了您的建议和示例。最后一个问题,我会考虑这个答案。如果我想将整个事件包装到一个更大的函数中,然后获取异步功能的输出,比如输出1为完整或错误为0,那么最佳方法是什么? –

+0

“最好的方法”是你更好的理解和更简单的实施。本质上,我会在瀑布内创建一个瀑布,如果我只使用“异步”,但这种方法对于大多数用户来说会很复杂。我会考虑使用'事件'或承诺,并正确地构建我的代码尽可能保持和简单。 – Gntem

+0

谢谢GeoPhoenix。你是对的,我需要把我的头围绕异步概念更好一点。有了“事件”,你在说EventEmitter类中的Event Emitter吗?再次感谢。 –