2017-02-22 91 views
2

我正在使用藍鳥和貓鼬,我在前一個函數中獲取用戶數組。我想更新users,以便爲我的陣列中的每個用戶設置屬性hasCar true或false。Promise所有地圖更新陣列

function findCars(users) { 
    return Promise.all(users.map((user) => { 
    return Car.count({ 
     _creator: new ObjectId(req.user), 
     userId: user._id 
    }) 
    .then((car) => { 
     user.hasCar = !!car; 
     return user; 
    }); 
    })) 
    .then(console.log); 
} 

的問題是,在這些的console.log用戶不必財產hasCar集。我嘗試了不同的方式,但沒有成功。

+1

代替'網友[指數] .hasCar = ...',爲什麼不直接使用'user.hasCar = ...'的? – Phil

+1

而不是'if(car){... = true; } else {... = false; }'爲什麼不簡單地使用'... =布爾(汽車);'? – Bergi

+0

嘿,謝謝菲爾的回答,我也嘗試過這種方式,並且在'else'之後還有'return user',不起作用,我仍舊得到舊用戶。 – John

回答

0

它似乎可以正常工作。我做了一些簡單的修改僞造出Car.count和去除ObjectId,它按預期工作:

const cars = {1: ['car a', 'car b'], 3: ['car c']}; 

const Car = { 
    count: (user) => new Promise((resolve, reject) => 
         setTimeout(() => resolve(cars[user.userId]), 1000)) 
}; 

function findCars(users) { 
    return Promise.all(users.map((user) => 
    Car.count({ 
     userId: user._id 
    }) 
    .then((car) => { 
     user.hasCar = !!car; 
     return user; 
    }) 
)) 
    .then(console.log); 
} 

const users = [{_id: 1}, {_id: 2}, {_id: 3}]; 

findCars(users); 

這會返回一個承諾,一秒鐘後記錄以下控制檯:

[{"_id":1,"hasCar":true},{"_id":2,"hasCar":false},{"_id":3,"hasCar":true}] 

注,我原來使用的更簡單

count: (user) => Promise.resolve(cars[user.userId]) 

但我想確保一些真正的異步。這兩種方式都沒有任何問題。

你可以在RunKit上看到這一點。

+0

感謝斯科特爲您的時間,這讓我瘋狂,我終於找到罪魁禍首,這是我的貓鼬,我編輯了我的帖子。 – John

+0

@John:很高興你找到了。你在這裏做過類似我的測試嗎,還是通過調試器運行? –

1

發現有什麼問題,看來你不能添加一個在我的貓鼬模型中不存在的屬性User。要繞過它,我做的事:

let updatedUser = user.toObject(); 
updatedUser.hasCar = !!car; 
return updatedUser; 

謝謝大家