2017-02-22 45 views
2

Я использую bluebird и mongoose, я получаю массив пользователей в предыдущей функции. Я хочу обновить users, чтобы установить свойство hasCar true или false для каждого пользователя из моего массива.Обещание всей карты обновления массива

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; } 'почему бы просто не использовать' ... = Boolean (car); '? – Bergi

+0

Эй, спасибо Филу за ваш ответ, я также пробовал это раньше, а также «возвращать пользователя» после 'else', не работает, я все равно получаю старого пользователя. – 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

@ Джон: Рад, что ты его нашел. Вы сделали что-то вроде моего теста здесь или запустили его через отладчик? –

1

Нашли, что не так, кажется, вы не можете добавить свойство, которого нет в моей модели мангуста User. Чтобы обойти это я сделал:

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

Спасибо всем