returns Promise 在 ScalaJS 中的方法的门面

facade for a method that returns Promise in ScalaJS

我正在为 PouchDB Put Method

编写门面

这是我的正面

@JSName("PouchDB")
class PouchDB extends js.Object {
      type CALLBACK = js.Function2[js.UndefOr[js.Dynamic], js.UndefOr[js.Dynamic], Unit]

def this(name: js.UndefOr[String] = js.undefined, options: js.UndefOr[PouchDBOptions] = js.undefined) = this()

def put(doc: js.Object, docId: js.UndefOr[String] = js.undefined, docRev: js.UndefOr[String] = js.undefined, options: js.UndefOr[js.Object] = js.undefined, callback: CALLBACK = ???): Unit = js.native

...

put API 接受回调和 returns Promise,我如何定义 put API 的外观,其中 return promise..

您的 Promise 需要一个类型,就像其他所有内容一样。 promise 没什么神奇的,它只是一个带有接口的对象,您可以输入该接口。您将需要知道 PouchDB 承诺的 API 是什么,但它很可能(非常)接近 Promises/A+。在那种情况下,它看起来像这样:

import scala.scalajs.js
import js.annotation.JSName

trait Promise[+A] extends js.Object {
  @JSName("then")
  def andThen[B](onFulfilled: js.Function1[A, B],
      onRejected: js.Function1[Any, B]): Promise[B] = js.native

  @JSName("then")
  def andThen[B](onFulfilled: js.Function1[A, B]): Promise[B] = js.native

  @JSName("then")
  def andThen[B >: A](onFulfilled: Unit = (),
      onRejected: js.Function1[A, B] = ???)): Promise[B] = js.native
}

这有点令人费解,因为未指定的处理程序意味着如果未指定 onFulfilled 处理程序,则 then 返回的承诺可以包含与此承诺相同类型的值。但我相信它应该像这样工作。

然后您可以声明 put 为某些适当类型 A 返回 Promise[A]

几年后更新;-)

Scalajs 包含 JS Promise 的内置类型,只需使用 js.Promise[_].

参见:https://www.scala-js.org/doc/interoperability/types.html