如何使用“Q.set”?

How can I use `Q.set`?

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

考虑以下代码行:

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

我本以为会打印 {"foo": "baz"},但实际上是 undefined

我是不是误解了 set 方法,还是只是用错了方法?

Q.set 用于扩充一个对象,在未来它不会 return 扩充的对象(事实上,它根本不会 return 任何东西).这就是为什么您在 console.log.

中得到 undefined

你需要这样使用它

var obj = {
    foo: "bar"
};

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

这将打印

{ foo: 'baz' }

属性 fooobj 中设置为 baz 并且由于它是沿着承诺链传递的,我们需要显式打印它。


你可以像这样使用姊妹功能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 想改变这个,但它被拒绝了。