Page 228 - AngularJS权威教程
P. 228

208  第 18 章  服务器通信


                 不像其他的服务,要让SQS服务运行,需要集成稍微多一点东西,因为这个服务要求我们有
             一个URL来跟它们交互。在我们的AWSService服务对象中,我们需要缓存正在处理的URL,并
             且改成每次使用生成的服务对象时创建一个新对象。不过,这个流程背后的原理还是完全一样的。

                  // ...
                  self.$get = function($q, $cacheFactory) {
                      var dynamoCache = $cacheFactory('dynamo'),
                          s3Cache = $cacheFactory('s3Cache'),
                          sqsCache = $cacheFactory('sqs');
                      // ...
                      sqs: function(params) {
                         var d = $q.defer();
                         credentialsPromise.then(function() {
                             var url = sqsCache.get(JSON.stringify(params)),
                                 queued = $q.defer();
                             if (!url) {
                                 var sqs = new AWS.SQS();
                                 sqs.createQueue(params,
                                     function(err, data) {
                                     if (data) {
                                         url = data.QueueUrl;
                                         sqsCache.put(JSON.stringify(params), url);
                                         queued.resolve(url);
                                     } else {
                                         queued.reject(err);
                                     }
                                 });
                             } else {
                                 queued.resolve(url);
                             }
                             queued.promise.then(function(url) {
                                 var queue =
                                     new AWS.SQS({params: {QueueUrl: url}});
                                 d.resolve(queue);
                             });
                         })
                         return d.promise;
                     }
                 // ...
                 现在,我们可以在createPayment()函数中使用SQS了。SQS服务的一个注意事项是它只能
             发送简单信息,比如带有字符串和数字的信息。它不能发送对象,所以我们需要在任意想传送给
             队列的对象上调用JSON.stringify。

                  // ...
                  ChargeTable: "UserCharges",
                  // ...
                  createPayment: function(item, charge) {
                      var d = $q.defer();
                      StripeService.createCharge(charge)
                          .then(function(data) {
                              var stripeToken = data.id;
                              AWSService.sqs(
                                 {QueueName: service.ChargeTable}
                             ).then(function(queue) {
                                 queue.sendMessage({
                                     MessageBody: JSON.stringify({
                                         item: item,
   223   224   225   226   227   228   229   230   231   232   233