【问题标题】:Object property not being set but console says otherwise未设置对象属性,但控制台另有说明
【发布时间】:2014-09-18 22:57:54
【问题描述】:

我正在尝试使用 Angular 设置条带验证服务。我基本上想调用 StripeResponse.get() 并让它返回错误或 Stripe 响应的令牌。

我的问题是,当我执行此代码时,如果我执行var a = StripeResponse.get(); 然后将a 记录到控制台,我会看到null

如果我在return this.response; 之前添加console.log(this);,我会看到以下内容:

Object {response:null, get: function}
 > get: function() {
 v response: Object
    code: "invalid_number"
    message: "This card number looks invalid"
    param: "number"
    type: "card_error"

我不明白该控制台日志中“响应:null”和“响应:对象”之间的差异。下面是我的服务/模块代码。

var app = angular.module('StripeVerify', [ ]);

app.service('StripeResponse', function () {
  return {
    response: null,
    get: function () {
      var form = $('form[name="ccForm"]');
      Stripe.createToken(form, $.proxy(function (status, response) {
        if (response.error) {
          return this.response = response.error;
        } else {
          return this.response = response.id;
        }
      }, this));
      return this.response;
    }
  }
});

【问题讨论】:

  • 您使用的是 Chrome 控制台吗?如果是这样,它会显示对 this 的引用,该引用会在您的异步任务期间更新,并且控制台也会更新。查看 createToken 方法是否返回承诺或其他内容。
  • 对 Stripe 的调用是异步的,使用 promise 从get()返回
  • @charlietfl 老实说,我不知道如何使用从 get() 返回的承诺。我了解承诺的概念,但我不知道如何将其合并到代码中。
  • @PSL createToken 似乎没有返回承诺。在 Stripe 的网站上,createToken“负责向 Stripe 发送卡详细信息并等待令牌或错误响应”。
  • @Mephoros 所以你应该让你的StripeResponse get 方法异步。您可以使用延迟对象来管理您自己的承诺。

标签: javascript jquery angularjs stripe-payments


【解决方案1】:

由于createToken 方法不返回承诺或没有任何类型的回调机制,您应该只使用角度$q's Defered API 并为您的服务创建承诺模式。

app.service('StripeResponse', ['$q', function ($q) {
  return {
    response: null,
    get: function () {
      var defered = $q.defer(); //Create a deffered object

      var form = $('form[name="ccForm"]');
      Stripe.createToken(form, function (status, response) {
        if (response.error) {
           defered.reject(response.error); //reject the promise

        } else {
            defered.resolve(response.id); //resolve the promise
        }

      });
      return defered.promise;
    }
  }
}]);

而在使用服务时你会做的(伪代码):

  StripeResponseService.get()
  .then(function(id){//Handle Success
  })
  .catch(function(error){//Handle failure
  })

【讨论】:

  • 非常感谢那个指向 $q API 的链接。这非常有效。谢谢!我现在要更多地研究延迟对象和承诺,这样我就不必重复这种问题了。
猜你喜欢
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多