2016-03-06 195 views
2
function art(dataToArt){ 
    var figlet = require('figlet'); 
var result; 
figlet(dataToArt, function(err, data) { 
    if (err) { 
     console.log('Something went wrong...'); 
     console.dir(err); 
     return; 
    } 
    var result = data; 
}); 
return result; 
} 

test = art('Hello World'); 

console.log(test); 

运行这会产生“未定义”。如何访问函数figlet对函数figlet外部定义的变量结果所做的更改。访问变量超出范围? nodejs

+1

好像'figlet'是一个异步函数。你不能。您需要在回调中完成所有工作。 –

+0

我使用的是https://www.npmjs.com/package/figlet,我从来没有使用nodejs –

+0

“[为什么我的变量在函数内部修改后没有改变?](http:// stackoverflow .com/questions/23667086/why-is-my-variable-un -tered-after-i-modify-it-inside-of-a-function-asynchron)“虽然,你在多个作用域中声明了'result',所以你'返回一个不同的'结果',而不是你分配'数据'。但是,改变('result = data;'不带'var')不会解决执行时间问题。 –

回答

4

它是异步代码。它不能做回报。它必须有回调,并在完成工作后作出回应。

var figlet = require('figlet'); 

function art(dataToArt, callback) 
{ 
    figlet(dataToArt, function(err, data) { 
     if (err) { 
      console.log('Something went wrong...'); 
      console.dir(err); 
      return callback(''); 
     } 

     callback(data); 
    }); 
} 


art('Hello World', function (data){ 
    console.log(data); 
    // also You can do operations here. 
    // for example can save to db or send to somewhere. 
}); 
+1

谢谢,我的[电报机器人开始工作](https://telegram.me/bigletterbot) –

2

answer由@num8er是完全正确的。

我个人比较喜欢使用promises

var figlet = require('figlet'); 

function art(dataToArt) { 
    return new Promise(function(fullfil, reject) { 
     figlet(dataToArt, function(err, data) { 
      if (err) { 
       reject(err); 
      } else { 
       fullfil(data); 
      } 
     }); 
    }); 
} 

art('Hello World').then(function(result) { 
    console.log(result); 
}); 
+1

这工作在本地,但不是在我的[Telegram Bot](https://telegram.me/bigletterbot)不管怎样谢谢你的答案,对不起,我不能+1你的答案,因为stackoverflow不让我。 –