gpt4 book ai didi

jquery - 如何让 jquery .each 循环等待响应?

转载 作者:行者123 更新时间:2023-12-01 04:43:09 25 4
gpt4 key购买 nike

当我调用第二个函数(该函数调用 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?
}
});
}

我的问题是迭代没有等待。
我的代码有什么问题?

最佳答案

最简单的方法是使用 Promises 和 Deferreds(在 jQuery 中)

您的代码大致如下:

function subscriptionStatus( sku ){
var $dfd = jQuery.Deferred();
var lambda = new AWS.Lambda();
lambda.invoke({
FunctionName: 'MyFunction',
Payload: JSON.stringify({
"sku":sku
})
}, function(err, data){
if( data.Payload == 'true'){
$dfd.resolve();
}else{
$dfd.reject();
}
});
return $dfd.promise();
}

您现在可以执行以下操作:

subscriptionStatus(<sku>)
.done(function() {

}).fail(function() {

});

现在是最精彩的部分:如何在 .each 循环中实现这一点?这取决于它是否需要按正确的顺序,或者您是否只需等到它们全部完成。如果您只需等待所有任务完成(不按特定顺序):

// no particular order
var deferreds = []; // does nothing yet
$('.bla').each(function(){
var $this = $(this);
var $msgDiv = $this.closest('.subscriptionMessage');
var sku = $this.attr('data-sku');
var $dfd = subscriptionStatus(sku)
.done(function() { $msgDiv.html('Successful'); })
.fail(function() { $msgDiv.html('Failed'); });
deferreds.push($dfd);
});
jQuery.when.apply(jQuery,deferreds)
.done(function() { alert('all successful'); })
.fail(function() { alert('any of the requests was not succesful'); })
.always(function() { alert('they are all done'); });

关于jquery - 如何让 jquery .each 循环等待响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com