2015-06-18 5 views
1

В соответствии с API reference Q предоставляет обещания для работы с объектами, но они не ведут себя так, как я ожидал.Как я могу использовать `Q.set`?

Рассмотрим следующую строку кода:

Q({foo:"bar"}).set("foo","baz").then(console.log); 

я ожидал бы {"foo": "baz"} для печати, но на самом деле это undefined.

Неужели я неправильно понимаю метод set, или я просто использую его неправильно?

ответ

2

Q.set Используется для увеличения объекта в будущем, и он не возвращает расширенный объект (фактически, он ничего не возвращает). Вот почему вы получаете undefined в console.log.

Вы должны использовать его как этот

var obj = { 
    foo: "bar" 
}; 

Q(obj).set("foo", "baz").then(function() { 
    console.log(obj); 
}); 

Это напечатает

{ foo: 'baz' } 

Свойство foo установлен как baz в obj и, поскольку она передается по обещанию цепи, нам нужно для его явной печати.


Вы можете использовать функцию сестра, Q.get, как это

Q(obj).set("foo", "baz").then(function() { 
    return Q.get(obj, 'foo'); 
}).then(console.log); 

Вы можете быть удивлены, почему вы не можете сделать

Q(obj).set("foo", "baz").get('foo').then(console.log); 

Это не будет работать, из-за той же причине почему set не работал во-первых. set не разрешается с измененным объектом. Вот почему нам нужно явно получить его от фактического объекта.


FWIW, я нашел это, set не будучи в цепочке, немного странно. Итак, I submitted a pull request to the Q library, чтобы изменить это, и оно было отклонено.

Смежные вопросы