在ScalaJS中返回Promise的方法的facade

时间:2015-02-18 04:44:01

标签: scala.js

我正在为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接受回调并且还返回Promise,我如何为put API定义outlook以返回promise ...

2 个答案:

答案 0 :(得分:2)

您需要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
}

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

然后,您可以声明put为某个合适的Promise[A]类型返回A

答案 1 :(得分:0)

几年后更新;-)

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

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