2016-03-06 162 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不讓我。 –