如何 return 来自 Breeze 的 ECMASCRIPT 6 Promise

How to return ECMASCRIPT 6 Promise from Breeze

一个breeze查询returns接口breeze.Promises.IPromise.

它正在使用 kris kowal 的 Q promises.,它使用 Q.Deferred 到 return 的承诺。

Q 使用 Q.Promise 公开了一个符合 ES6 的 Promise。

如何从 breeze 查询中获取 ES6 Promise?我基本上希望有一种巧妙的方法将 Q.Deferred 转换为 Q.Promise。

function getES6Promise () {
    var query = breeze.EntityQuery.from("Table");
    // How to return as an ES6 Promise?
    return em.executeQuery(query);
}

我相信您必须在 Promise 周围配置 breeze,使其看起来像 Q

Breeze 只需要 Q 界面的一小部分:deferresolverejectdefer 有一个 promise 属性。 resolvereject return 承诺。承诺可以来自任何库,只要它具有合适的 then 方法。

这是我想出来但还没有真正尝试过的包装纸:

(function () {
  function defer() {
    var deferred = {}
    deferred.promise = new Promise((resolve, reject) => {
      deferred.resolve = resolve;
      deferred.reject = reject;
    })
    return deferred;
  }
  var Q = {
    all: Promise.all,
    defer: defer,
    resolve: Promise.resolve,
    reject: Promise.reject
  }
  breeze.config.setQ(Q)
})()

FWIW,您所引用的 breeze.Promises.IPromise 接口没有用,应该从文档中删除。

事实是 Breeze 操作 return 的承诺具有您选择的任何承诺库的形状和特征,当然不需要遵守 that 接口.

许多 API 和文档示例使用 failfin。显然,这些不是 ES6 承诺的方法,也不会起作用。 fail 需要 catchfin(finFn) 需要 then(finFn, finFn)

幸运的是,breeze 内部仅调用 promise.then,不使用这些其他 promise 方法。

找个时间试试我的包装建议,让我们知道结果如何。