【问题标题】:async functions inside jquery each() loopsjquery each() 循环中的异步函数
【发布时间】:2022-02-10 07:08:45
【问题描述】:

我在 Javascript/Jquery 中为每个选中的复选框运行了一个循环。

在这个循环中,我调用了一个异步函数,该函数将返回一个 Tile Layer(Image)。 我必须向这个函数传递一个名为 checkboxPermanent 的参数。 调用此函数后,变量 checkboxPermanent 改变了它的值,不知道为什么。 在序列中,它调用了一个类似的函数,但现在传递了相同的变量,但参数值错误。

$('#exec-perm').on('click',  function () {
            var checkboxPermanent;
            $('#checks-perm input').each(async function () {
                checkboxPermanent = $(this).attr('value');
                isChecked = $(this).prop('checked');
                permanent = permanent_layers[checkboxPermanent]   // começa com valor undefined, no próximo loop passa a conter um objeto para que possa cair na codição 1
                pixel_permanent = pixel_permanent_layers[checkboxPermanent]
                if (permanent) {
                    if (!isChecked) {
                        map.removeLayer(permanent)
                        map.removeLayer(pixel_permanent)
                        ctrlLayers.removeLayer(permanent)
                        ctrlLayers.removeLayer(pixel_permanent)
                    } else if (isChecked && state_faz == faz_value && state_ano_safra == ano_safra_value && state_profundidade == profundidade_value) {
                        //map.addLayer(permanent)
                        //map.addLayer(pixel_permanent)
                        map.removeLayer(permanent)
                        map.removeLayer(pixel_permanent)
                        ctrlLayers.removeLayer(permanent)
                        ctrlLayers.removeLayer(pixel_permanent)
                        ctrlLayers.addOverlay(permanent, 'Mapa de ' + checkboxPermanent);
                        ctrlLayers.addOverlay(pixel_permanent, 'Mapa de ' + checkboxPermanent + ' - Pixels');
                    } else if (isChecked && (state_faz != faz_value || state_ano_safra != ano_safra_value || state_profundidade != profundidade_value)) {
                        map.removeLayer(permanent)
                        map.removeLayer(pixel_permanent)
                        ctrlLayers.removeLayer(permanent)
                        ctrlLayers.removeLayer(pixel_permanent)
                        permanent = wmsPermRasterCall(checkboxPermanent, faz_value, profundidade_value);
                        pixel_permanent = wmsPixelPermCall(checkboxPermanent, faz_value, profundidade_value);
                        permanent_layers[checkboxPermanent] = permanent; // armazena o valor  no array para que possa cair na condicional que irá excluir os layers do control
                        pixel_permanent_layers[checkboxPermanent] = pixel_permanent;
                        //map.addLayer(permanent);
                        //map.addLayer(pixel_permanent);
                        ctrlLayers.addOverlay(permanent, 'Mapa de ' + checkboxPermanent);
                        ctrlLayers.addOverlay(pixel_permanent, 'Mapa de ' + checkboxPermanent + ' - Pixels');
                    }
                } else if (isChecked) {
                    console.log(checkboxPermanent)
                    permanent = wmsPermRasterCall(checkboxPermanent, faz_value, profundidade_value);
                    console.log(permanent)
                    pixel_permanent = wmsPixelPermCall(checkboxPermanent, faz_value, profundidade_value);
                    //console.log(checkboxPermanent)
                    permanent_layers[checkboxPermanent] = permanent; // armazena o valor  no array para que possa cair na condicional que irá excluir os layers do control
                    pixel_permanent_layers[checkboxPermanent] = pixel_permanent;
                    //map.addLayer(permanent);
                    //map.addLayer(pixel_permanent);                        
                    ctrlLayers.addOverlay(permanent, 'Mapa de ' + checkboxPermanent);
                    ctrlLayers.addOverlay(pixel_permanent, 'Mapa de ' + checkboxPermanent + ' - Pixels');
                }
                if (checkboxPermanent == 'altimetria') {
                    leg_permanent[checkboxPermanent] = 'Emp:' + checkboxPermanent + '_' + faz_value
                    leg_pixel_permanent[checkboxPermanent] = 'Emp:mv_' + checkboxPermanent + '_sql'
                } else {
                    leg_permanent[checkboxPermanent] = 'Emp:' + checkboxPermanent + '_' + faz_value + '_p' + profundidade_value
                    leg_pixel_permanent[checkboxPermanent] = 'Emp:mv_' + checkboxPermanent + '_sql'
                }
            });
        })

如果我在 wmswmsPermRasterCall() 之前 console.log(checkboxPermanent) 它将返回正确的值。 如果我在调用 wmswmsPermRasterCall() 后立即 console.log(checkboxPermanent),它会得到一个不同的值..

async function wmsPermRasterCall(checkboxPermanent, faz_value, profundidade_value) {
        //var colorRampSLD = getStyles(faz_value, checkboxPermanent)

        if (checkboxPermanent == 'altimetria') {
            var raster_name = checkboxPermanent + '_' + faz_value
            getColors = await getStyles(faz_value, checkboxPermanent)
            var colorEnv = '';

            for (var j = 0; j < getColors.length; j++) {
                if (j + 1 >= getColors.length) {
                    colorEnv += 'c' + j + ':' + getColors[j]
                } else {
                    colorEnv += 'c' + j + ':' + getColors[j] + ';'
                }
            }

            return L.tileLayer.wms('http://localhost:8080/geoserver/Emp/wms', {
                layers: 'Emp:' + raster_name,
                transparent: true,
                format: 'image/png',
            }).setParams({
                env: colorEnv
            })
        } else {
            return L.tileLayer.wms('http://localhost:8080/geoserver/Emp/wms', {
                layers: 'Emp:' + checkboxPermanent + '_' + faz_value + '_p' + profundidade_value,
                transparent: true,
                format: 'image/png',
            })
        }

    }

我在这里错过了什么?

【问题讨论】:

  • 在你的函数之外定义checkboxPermanent意味着每个异步回调在不同的时间修改相同的引用。为什么不直接在回调中定义呢?
  • 在 jQuery on click 函数中有一个 checkboxPermanent 变量...而在 wmsPermRasterCall 函数中有一个(不同的)... 很可能是范围混淆的根源。
  • @Phil ...不敢相信我是如此愚蠢。做到了!!谢谢!

标签: javascript jquery async-await


【解决方案1】:

在这里查看:

 console.log(checkboxPermanent)
 permanent = wmsPermRasterCall(checkboxPermanent, faz_value,  profundidade_value);
 console.log(permanent)

此函数是异步的,它将在您的函数之外运行,您的代码将在wmsPermRasterCall 完成之前继续运行。

您需要使用 await 等待 wmsPermRasterCall 的结果:

 console.log(checkboxPermanent)
 permanent = await wmsPermRasterCall(checkboxPermanent, faz_value,  profundidade_value);
 console.log(permanent)

您的代码将暂停直到 wmsPermRasterCall 完成。

【讨论】:

  • 对不起。我发布了错误版本的代码。在 wmsPermRasterCall() 之前我已经等待了。问题依然存在
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多