2

我正在尝试使用使用承诺的回调函数构建的 API。

为了测试它,我创建了这三个函数:

this.functionResolve = (data) => console.log('resolved: ' + data)
this.functionError = (data) => console.log('error: ' + data)
this.functionSucess = (data) => console.log('success: ' + data)

如果使用正常的回调函数,一切正常,我得到两个日志。(解决和错误/成功取决于 cardBin 通知)

PagSeguroDirectPayment.getBrand({ cardBin: "000000", complete: this.functionResolve, success: this.functionSucess, error: this.functionError });

要将其转换为承诺,我最终得到了这个:

this.promisifyCallback = function() {
    return new Promise((resolve, _success, _error) => {
        PagSeguroDirectPayment.getBrand({
            cardBin: "000000",
            complete: resolve,
            success: _success,
            error: _error
        });
    });
}

当我打电话时,this.promisifyCallback().then(this.functionResolve, this.functionSucess, this.functionError)只会出现解析日志。

如果有人想检查,PagSeguroDirectPayment 对象可在以下位置获得:PagSeguro API

4

1 回答 1

4

承诺执行器函数(您传递的回调new Promise)只接收两个参数,而不是三个:(resolve解决项目)和reject(拒绝它)。(您可以随意称呼它们;这些是常用的名称。)

这意味着您当前的代码:

  • 您将在请求完成后解决,无论它是否有效,因为success: resolve
  • 当请求成功时你会拒绝(因为success: _success)(除非 APIcomplete首先调用处理程序;一个承诺只能被解决或拒绝一次)
  • 您的_error参数将始终是undefined

反而:

this.promisifyCallback = function() {
    return new Promise((resolve, reject) => {
        PagSeguroDirectPayment.getBrand({
            cardBin: "035138",
            //complete: ,
            success: resolve,
            error: reject
        });
    });
}

使用Promise 时,您可以通过使用(在最新的环境中,或使用 polyfill —最近添加的)来获得行为。complete.finallyfinally

当我打电话时,this.promisifyCallback().then(this.functionResolve, this.functionSucess, this.functionError)只会出现解析日志。

你会这样使用它:

this.promisifyCallback()
    .then(this.functionSucess, this.functionError)
    .finally(this.functionResolve); // See ¹

或者

this.promisifyCallback()
    .then(this.functionSucess)
    .catch(this.functionError)
    .finally(this.functionResolve); // See ¹

¹ Promise 语言中的“Resolve”表示“成功完成”(有时也使用“fulfill”)。“拒绝”意味着失败。“解决”意味着解决或拒绝。

于 2018-05-10T14:43:53.317 回答