2017-02-28 71 views
0

是forEach上的數組異步?糖果是一系列糖果對象。Node.js中的Array.forEach是異步的嗎?

app.get('/api/:id',function(req, res){ 

    console.log("Get candy"); 
    var id = req.params.id; 

    candies.forEach(function(candy, index){ 
    if(candy.id == id){ 
     console.log("Candy found. Before return"); 
     return res.json(candy); 
     console.log("Candy found. After return"); 
    } 
    }); 

    console.log("Print error message"); 
    return res.json({error: "Candy not found"}); 
}); 

在控制檯中我得到

[nodemon] starting `node app.js` 
listning on port 3000 
Get candy 
Candy found. Before return 
Print error message 
Error: Can't set headers after they are sent. 
    at ServerResponse.setHeader (_http_outgoing.js:367:11) 
    .... 

這是最近的變化?已經過了一段時間了,因爲我已經完成了node.js

+3

爲什麼你在'return'之後有代碼? – Thilo

+0

如果它是異步的,你會首先記錄'打印錯誤信息'。爲什麼它是異步的?另外,Thilo正確指出 - 「return」語句後的代碼點是什麼?那永遠不會被執行。 – Mjh

+1

此外,內部函數中的'return'只會退出內部函數,而不是外部函數。 – Thilo

回答

1

你會得到Can't set headers after they are sent.異常,因爲你試圖在candies.forEach之內兩次返回響應(可能),並且再次返回路由的最後一行。還請注意,return之後的任何代碼都不會被執行。

這裏是你如何把它改寫,以避免錯誤 -

app.get('/api/:id',function(req, res){ 

    console.log("Get candy"); 
    var id = req.params.id; 
    var foundCandy = false; 
    candies.forEach(function(candy, index){ 
     if(candy.id == id){ 
      foundCandy = true; 
      console.log("Candy found. Before return"); 
     } 
    }); 

    if (foundCandy) { 
     return res.json(candy); 
    } else { 
     return res.json({error: "Candy not found"}); 
    } 
}); 
+0

@Jens使用'Array.filter'就像@Vladu Ionut的迴應[這裏](http://stackoverflow.com/a/42504948/398713)也導致更簡潔和更簡潔的代碼。 – GPX

+0

謝謝!我知道如何解決它。我只是好奇,爲什麼我得到這種行爲。 res.json(candy)和res.json({error:「Candy not found」});被叫。這對我來說似乎不合邏輯,除非forEach現在是一個異步函數 – Jens

+0

明白了......看@Thilo回覆 – Jens

1

您可以使用Array.filter找到糖果。

app.get('/api/:id', function(req, res) { 

    console.log("Get candy"); 
    var id = req.params.id; 

    var result = candies.filter(candy => candy.id == id); 

    if (result.length) { 
    return res.json(result[0]); 
    } else { 
    console.log("Print error message"); 
    return res.json({ 
     error: "Candy not found" 
    }); 
    } 
}); 
+0

給其他人看這個問題: 「return res.json(candy);」只從forEach參數中定義的內部函數返回,它不會從整個函數中返回。 有兩個響應被調用。 – Jens