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,