根据API reference Q提供了使用对象的承诺扩展,但它们的行为并不像我期望的那样。
考虑以下代码行:
Q({foo:"bar"}).set("foo","baz").then(console.log);
我原本希望打印{"foo": "baz"}
,但它实际上是undefined
。
我是否误解set
方法,或者我只是以错误的方式使用它?
答案 0 :(得分: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
不可链接,有点奇怪。所以,我submitted a pull request to the Q library要改变这一点,它就被拒绝了。