我如何使用`Q.set`?

时间:2015-06-18 15:13:52

标签: javascript promise q

根据API reference Q提供了使用对象的承诺扩展,但它们的行为并不像我期望的那样。

考虑以下代码行:

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

我原本希望打印{"foo": "baz"},但它实际上是undefined

我是否误解set方法,或者我只是以错误的方式使用它?

1 个答案:

答案 0 :(得分:2)

Q.set用于增加一个对象,以后它不会返回增强对象(事实上,它根本不会返回任何内容)。这就是您在undefined中获得console.log的原因。

你需要像这样使用它

var obj = {
    foo: "bar"
};

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

这会打印

{ foo: 'baz' }

属性foobaz中设置为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要改变这一点,它就被拒绝了。