Creé una matriz. Quiero enviar una solicitud ajax con settimeout. Pero no puedo obtener el parámetro en settimeout. Cuando imprimo el registro de la consola, la variable i no está definida. ¿Como puedó resolver esté problema?

Resultado del registro de la consola

i undefined

Código Javascript

$scope.type = ["st", "ct", "sc", "rm", "bg", "sf", "fl", "sq", "pr", "cr", "vl", "fd"];

for (var i = 0; i < $scope.type.length; i++) {
    setTimeout(function (i) {
        console.log("i", i);
        $scope.params = {
            lat: $scope.lat,
            lng: $scope.lng,
            time: $scope.time,
            type: $scope.type[i]
        }
        console.log("params", $scope.params);
        return;
        $.ajax({
            type: 'post',
            url: "bz.php",
            dataType: 'json',
            async: true,
            cache: false,
            data: $scope.params,
            success: function (data) {
                if (data.response) {
                    console.log("data.response", data.response);
                    return;
                    if (!$scope.$$phase) $scope.$apply();
                } else if (data.response == null) {

                } else if (data.error) {

                }
            },
            error: function (data) {
            }
        });
    }.bind(this), i * 2000);
}
3
Hermes 13 nov. 2017 a las 19:19

2 respuestas

La mejor respuesta

No necesitas .bind(). Utilice let o const en lugar de var ...

const $scope = {};
$scope.type = ["st", "ct", "sc", "rm", "bg", "sf", "fl", "sq", "pr", "cr", "vl", "fd"];

for (let i = 0; i < $scope.type.length; i++) {
    setTimeout(function () {
        console.log("i", i);

        // your code

    }, i * 2000);
}

O simplemente pase i como argumento adicional a setTimeout.

const $scope = {};
$scope.type = ["st", "ct", "sc", "rm", "bg", "sf", "fl", "sq", "pr", "cr", "vl", "fd"];

for (var i = 0; i < $scope.type.length; i++) {
    setTimeout(function (i) {
        console.log("i", i);

        // your code

    }, i * 2000, i);
}
4
user8897421user8897421 13 nov. 2017 a las 16:22

Agregue i como tercer argumento de setTimeout para encapsularlo:

setTimeout(function(i){ // <--  ... and retrieved here again
   console.log(i);
}, i * 2000, i);// <--- i is stored here ...
5
Jonas Wilms 13 nov. 2017 a las 16:21