【问题标题】:How do I create a javascript promise which resolves to a thenable?如何创建解析为 thenable 的 javascript 承诺?
【发布时间】:2016-10-28 22:30:13
【问题描述】:

我正在使用 Promise 处理 faye browser client,并且我有一个函数可以在执行异步操作后创建一个 faye 客户端,如下所示:

function fayeClient() {
  return doSomethingAsychronous().then(function() {
    var faye_client = new Faye.Client('http://localhost/faye');
    return faye_client;
  });
}

我想这样使用它:

fayeClient().then(function(faye_client) {
  // do something with faye_client
});

问题是,faye_client 也是一个thenable,这意味着fayeClient 返回的promise 解析为faye_client '解析' 到的值。 但是,我希望承诺直接解析为faye_client

我什至无法使用 Promise.resolve(faye_client); 手动将值包装在 promise 中,因为使用了相同的 promise resolution procedure

我认为这可能表明 faye 滥用了 thenables,因为faye_client 并不代表未知的值。

有没有办法做出一个可以解析为一个值的承诺?

【问题讨论】:

  • 很好的问题。不过,我对一个短语有点困惑:“代表 faye 滥用承诺”是什么意思?您的意思是“faye 滥用承诺”,即“faye 滥用承诺”吗? (在这种情况下,faye 怎么会滥用 promise?如果我理解正确的话,faye 根本不使用 promise;它只是碰巧有一个“then”方法。)或者你的意思是“promises 在 faye 上行为不端”代表”?还是您的意思是“我代表 faye 滥用了承诺”?
  • 是的,我的意思是“faye 对承诺的滥用”,但这有点不准确,所以我应该说“faye 对 thenables 的滥用”。

标签: javascript promise


【解决方案1】:

而不是直接返回faye_client 将其包装在一个对象中。它很丑,但它是你唯一的选择 A+ 承诺:

return {client: faye_client}; // no longer a thenable

一些替代的 Promise 实现公开了一个不会递归同化的 .then 或 .chain ,但老实说我会避免这些。

【讨论】:

  • 我最终为 faye 客户端创建了一个适配器对象。现在我可以在整个代码中使用我想要的 api。
  • 是的,完全正确。这就是我在这里的意思。您不能直接使用thenable 作为返回值,您必须将其包装起来。抱歉,我正在打电话,不想让你挂着。
【解决方案2】:

如果你使用new Promise 构造函数来解决promise呢?

return new Promise(function(resolve, reject) {
    resolve(faye_client);
});

【讨论】:

  • 虽然,resolve 可能也有同样的“thenable”逻辑?
  • 这取决于使用的库,但大多数库会同化 resolve 中的 thenables。但是,我目前正在写一个可以fulfilled 没有同化的。
  • @Bergi 它在规范中。有alternative libraries that don't follow the spec,但老实说,它们并不受欢迎,因为它们通常更难使用,并且不像 API 那样公开。也相关 - esdiscuss.org/topic/promise-cast-and-promise-resolve
  • @BenjaminGruenbaum:到目前为止,只有 then 被指定,Promise 构造函数仍然是提案。请注意,您链接的 lib 实际上是一个 Lazyness 包装器,它甚至不是异步的 - 不是我们对 Promise 的理解。我的意思是像 this (disclaimer: not yet finished) 这样的东西,最终会符合 A+
  • @Bergi 看起来不错 :) 祝你好运。至于 Promise 构造函数——它们是 A+ 的提议,但它们是为 ES6 Promise 指定的。
猜你喜欢
  • 2016-06-22
  • 2020-06-09
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
相关资源
最近更新 更多