2013-07-09 63 views
0

如果我有以下代碼:如何從回調中返回一個函數?

var content; 
var f = fs.readFile('./index.html', function read(err, data) { 
    if (err) { 
     throw err; 
    } 
    content = data; 
    return console.log(content); 
}); 

f(); 

我有以下幾點:

f(); 
^ 
TypeError: undefined is not a function 

我該怎麼做才能返回的功能,這是不是不確定?

我的真正的問題,在一個更大的背景是以下https://gist.github.com/jrm2k6/5962230

+0

你不這樣做,你需要執行_inside_的READFILE回調的行動 - 或接受回調本身的功能包裹。關於如何從AJAX調用中返回,請參見[this similar post](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call/16825593#16825593)。 –

+0

@BenjaminGruenbaum那麼''f' * *可能是一個函數。但是,'fs.readFile()'不會返回一個。 –

回答

3

你不能有用return從回調到你的代碼。

  1. 使用return回調內不返回值,你的代碼。 fs.readFile()本身會調用回調,因此return值被賦予給它。爲了讓您的代碼收到它,fs.readFile()將不得不return它從回調得到的值,它不。

  2. 而且,由於fs.readFile()是異步的,所以它實際上不能。您的代碼跨越2不同的時間點:

    1. 「存在」

      var content; 
      var f = fs.readFile('./index.html', /* ... */); 
      
      f(); 
      
    2. 「未來」

      /* ... */ 
      function read(err, data) { 
          if (err) { 
           throw err; 
          } 
          content = data; 
          return console.log(content); 
      } 
      /* ... */ 
      

你根本無法使用值來自「未來 「在」目前「中 - 或者在此時,」過去「。

這一切通常導致繼續callback模式,而不是使用return。以你的"real" code

var cheerioURLContent = function (url, callback) { 
    rest.get(url).on("complete", function (result) { 
     callback(cheerio.load(result)); 
    }); 
}; 

cheerioURLContent('./index.html', function (t) { 
    console.log(t); 
}); 
+0

好吧,以及如果我需要將這個函數cheerioURLContent分配給一個變量,該變量必須是一個函數呢?我必須推遲這項任務嗎? –

+0

@JeremyD問題是在試圖設置'var t = cheerio.load(result);'在實際存在'result'之前。就像'fs.readFile()'不能從回調中返回一個值一樣,'cheerioURLContent'和'rest.get()'都不能。 –

1

您可以將事件處理程序自定義事件和觸發(發射)從回調中的事件。剛開始時有點困難,但非常優雅。

查看Emitting event in Node.js的例子。

相關問題