標籤:

nodejs的回調函數里為什麼需要return?

最近在學習nodejs,最近照葫蘆畫瓢,用express+mongoose等寫了個rest介面,但不明白,在好多函數的callback里有return

比如

app.get("/api/healthtips/:htip", function (req, res) {
return HealthTipModel.find({"_id" : new ObjectId(req.params.htip)}, function (error, healthTip) {
if (!error) {
return res.send(healthTip);
}
});
});

這裡面有兩個callback,一個嵌套另一個,我不太知道為什麼要用return,return在這裡有什麼深層的含義嗎?貌似我把return都去掉,再次運行,也沒看出什麼區別


用return比else少一層縮進,對於多層回調時泛濫成災的callback來說,看起來多少順眼些。@程啟翔 的例子只有一層看不出太大區別,如果有3層就明顯了。

當然這跟結構性沒啥關係,就是看起來清晰點。

這是else的情況:

function dosomething(param) {
func1(param, function(err, data) {
if (err)
console.log(err)
else {
func2(data, function(err, result) {
if (err)
console.log(err)
else {
func3(data, function(err, result) {
if (err)
console.log(err)
else {
console.log(result)
}
}
}
}
}
}
}

改造成return是這樣:

function dosomething(param) {
func1(param, function(err, data) {
if (err)
return console.log(err)

func2(data, function(err, result) {
if (err)
return console.log(err)

func3(data, function(err, result) {
if (err)
return console.log(err)
console.log(result)
}
}
}
}


return的意思就是中斷後面的邏輯執行 很明顯 這樣寫最放心 指不定哪個db 在if 後面 外面又給你加了點料…


return 不光是結構性好,最大的好處是可以防止出錯,特別是callback里的callback,很多時候你if(xx) callback(); else .... 後面其實還有邏輯,很多人寫著寫著就忘了,最後else結束了再執行個callback或者其他事情,整個邏輯就崩潰了。所以這時候在if里return是非常有必要的(在某一行確定函數需要在此結束的時候)。當然不return,人工來保證也是可以的,但是別人來寫就很難保證了,我們代碼里偶爾就會看到這種現象,代碼量大了,維護的人多了。


看了上面幾個回答,大家都是講到了是使用return和還是else的一些使用技巧。

但是題主在這裡問得是nodejs的回調函數里為什麼需要return

我的回答是:除非需要提前結束流程,一般不需要使用return。上述代碼中兩處return均無必要。

app.get("/api/healthtips/:htip", function (req, res) {
HealthTipModel.find({"_id" : new ObjectId(req.params.htip)}, function (error, healthTip) {
if (!error) {
res.send(healthTip);
}
});
});

沒有任何深層含義,大膽的去掉即可。


樓主聽說過promise嗎


因為很多人認為

function (err, doc) {
if (err)
return console.log(err);
workWith(doc);
}

function (err, doc) {
if (err)
console.log(err);
else
workWith(doc);
}

看起來結構性好


可以return,就不用else。


沒有return還叫函數式風格嗎?雖然給出的代碼目前看return沒有用,到不代表以後沒有用。例如,將來別的地方需要你的返回值時,又或者你以後在下面添加其他邏輯時,顯式的return不容易讓你犯錯。

再者,別人維護你的代碼時,看見顯式的return會更有信心。

加上沒有壞處,還能彰顯逼格,不加隱患一堆。還是加上return吧。


難道大家沒聽說過golden path嗎?


推薦閱讀:

請問一下,跨平台解決方案中,Qt 和 Electron 孰優孰劣?
webpack這個js模塊管理器(module bundler)怎麼樣?
io.js 和 node.js 之間應該如何選擇?
如何評價node-fibers?
node相比傳統服務端技術棧差在哪裡?

TAG:JavaScript | Nodejs |