Typescript:如何使用回调调用 Javascript 函数

Posted

技术标签:

【中文标题】Typescript:如何使用回调调用 Javascript 函数【英文标题】:Typescript: how to call a Javascript function with a callback 【发布时间】:2017-12-18 07:52:21 【问题描述】:

我正在使用 Ionic 和 Typescript。我需要访问following api:

load(key, successCallback/*(value)*/, failCallback)

在 Typescript 中,我执行以下操作:

cordova.plugins.icloudkv.load('key').then((data) => 
    console.log(data);
    alert('load key: ' + JSON.stringify(data));
      );
    
  ).catch((e) => 
    console.error(JSON.stringify(e));
    this.doAlert('iCloud: ' + JSON.stringify(e));
  );

但是,alert 永远不会被解雇。

问题

请有人建议使用 typescript 调用 javascript 函数的最佳方法是什么?

谢谢

【问题讨论】:

它会返回一个承诺吗?如果不是,您可能需要执行以下操作:cordova.plugins.icloudkv.load('key', () =>, () =>) ?? 如果不是,你不能把它当作一个承诺。要么将其转换为 Promise(或可观察的 - github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/…),要么注意 TS 只是 JS 的一个子集,并像以前一样调用它,传入一个回调(箭头)函数。 您可以使用类中的方法作为成功/错误处理程序。 cordova.plugins.icloudkv.load('key', this.someClassMethod, this.someOtherClassMethod); @AlexanderStaroselsky 但请注意,如果您这样做,this 可能会以意想不到的方式表现。 【参考方案1】:

根据您提供的 api,您的代码应该看起来更像:

cordova.plugins.icloudkv.load('key', 
  (data)=>
    console.log(data);
    alert('load key: ' + JSON.stringify(data));
  , (e)=>
    console.error(JSON.stringify(e));
    this.doAlert('iCloud: ' + JSON.stringify(e));
);

【讨论】:

谢谢你,我只是在测试它,如果它有效,我会将其标记为答案【参考方案2】:

您是否在控制台中遇到任何错误?

您的代码假定 load 返回一个 Promise。看看这是否可行,因为该示例在 load 方法中明确要求两个回调:

cordova.plugins.icloudkv.load('key', (data) => 
        console.log(data);
        alert('load key: ' + JSON.stringify(data));
     , (e) => 
         console.error(JSON.stringify(e));
         this.doAlert('iCloud: ' + JSON.stringify(e));
 );

【讨论】:

另外,请记住,箭头函数this 将具有不同的范围。我的示例假设这是您想要的范围。 谢谢。你有正确的答案。但这与您之前发布的某人的答案相同,因此我将其标记为正确答案。你得到了赞成票哈哈【参考方案3】:

如果您更喜欢使用 Promise,即使 api 不使用,请在调用周围构造一个 Promise

new Promise((resolve, reject) => cordova.plugins.icloudkv.load('key', resolve, reject))
.then((data) => 
    console.log(data);
    alert('load key: ' + JSON.stringify(data));
      );
    
  ).catch((e) => 
    console.error(JSON.stringify(e));
    this.doAlert('iCloud: ' + JSON.stringify(e));
  );

【讨论】:

以上是关于Typescript:如何使用回调调用 Javascript 函数的主要内容,如果未能解决你的问题,请参考以下文章

在jQuery回调中调用TypeScript“this”范围问题

TypeScript 回调没有在其签名中完全实例化类

如何在返回其回调之一结果的函数的 Typescript 中声明类型?

如何将可选参数传递给typescript中的回调函数

如何在 javascript/typescript 事件回调中访问它,同时保留 removeEventListener 的能力? [复制]

TypeScript基础类型