【发布时间】:2015-12-10 19:01:32
【问题描述】:
当我调用第二个调用 AWS 中的脚本并等待 AWS 响应的函数时,如何在 .each 循环中等待迭代?
这是我的 .each 循环:
$('.subscriptionStatus').each(function(i, obj) {
var sku = $(this).attr('data-sku');
subscriptionStatus(sku, function(response) {
var messageDiv = $(this).closest('.subscriptionMessage');
var innerHtml = '';
if (response){
innerHtml = 'Successful';
}else{
innerHtml = 'Failed';
}
messageDiv.html(innerHtml);
}//wait until
}
对于每次迭代我调用一个函数,在里面我调用 AWS Lambda 中的一个脚本并且需要等待它的响应然后继续迭代:
function subscriptionStatus( sku, callback ){
var lambda = new AWS.Lambda();
lambda.invoke({
FunctionName: 'MyFunction',
Payload: JSON.stringify({
"sku":sku
})
}, function(err, data){
//response from AWS Lambda
var success = data.Payload;
if( success == 'true'){
//NEED TO PASS TRUE BACK TO THE CURRENT ITERATION OF THE EACH LOOP
callback(true); //correct way?
}else{
//NEED TO PASS FALSE BACK TO THE CURRENT ITERATION OF THE EACH LOOP
callback(false); //correct way?
}
});
}
我的问题是迭代没有等待。
我的代码有什么问题?
【问题讨论】:
-
您必须停止使用 .each,因为它永远不会等待异步操作。
-
我并不是说这是居高临下之类的,但您应该完全阅读这篇文章:journal.stuffwithstuff.com/2015/02/01/… 这是对您在这里遇到的问题的超级有趣的描述。问题基本上是您在同步循环内调用异步函数。所以唯一的方法是阻塞循环中的每个调用,直到它返回。看起来 lambda 函数对同步执行有了新的支持,但是文档很模糊:docs.aws.amazon.com/lambda/latest/dg/…
-
@Milimetric 你说“所以唯一的方法是阻止循环中的每个调用,直到它返回。”我该怎么做?
-
@Miss_poker 你不能...除非 lambda 有同步选项。但请注意,该选项会导致您的应用程序在循环期间冻结,包括所有 css 动画、gif、加载栏和用户交互。
-
@KevinB 所以除了 .each 还有什么我可以使用的吗?
标签: jquery callback aws-lambda