【问题标题】:Jquery Ajax call not executed in for loopJquery Ajax 调用未在 for 循环中执行
【发布时间】:2016-06-08 04:26:16
【问题描述】:

使用此功能

  function readPinMode(callback,pin){
     $.ajax({
        type: 'GET',
        url: path,
        data: {
        'funct': "readPinMode", //function included and working ou of loops
        'pin': pin,
        'php': 0
     },
     success: function (result) {
        //console.log(result);
        callback(result);
     },
        error: function (xhr, textStatus, error) {
        console.log(xhr);
        console.log(textStatus);
        console.log(error);
    }
   });
 };

这样一来,根本就什么都不做:

      $( document ).ready(function() {
  <?php
  $js_array = json_encode($GLOBALS['gpio']); // got from included file, working
  echo "var pins = ". $js_array . ";\n";
  ?>
  console.log( "Document ready." );
  for (i = 0; i < pins.length; i++) {
        var mode = "m" + pins[i];
        function initMode(){
        readPinMode(function(ret){
        console.log(ret);
        $(mode).text(ret);
        console.log(mode);
      }, pins[i]);
    };
  }

它进入了for循环(我可以登录控制台modepins[i],它们正在工作)但该函数似乎没有被调用。 控制台不显示任何内容。

有没有办法解决这个问题? 谢谢

【问题讨论】:

  • 永远不要在循环中使用 ajax。
  • ret 是ajax成功方法的结果
  • function initMode() 在那里做什么??你只是在定义一个函数。并且不执行它..因为它具有调用 AJAX 并接收结果的逻辑
  • 首先在i前加var。而且您不需要该函数 initMode() {},它只是在循环内声明函数,没有任何反应。
  • mode 应该是什么?它是 HTML 元素 ID 吗? pins 到底是什么?

标签: javascript jquery ajax for-loop


【解决方案1】:

我建议不要使用需要适当关闭的真正循环,而是在成功时再次运行

<?php
  $js_array = json_encode($GLOBALS['gpio']); // got from included file,  working
  echo "var pins = ". $js_array . ";\n";
?>
var cnt = 0;
function readPinMode(){
  if (cnt>=pins.length) return;      
  $.ajax({
    type: 'GET',
    url: path,
    data: {
    'funct': "readPinMode", //function included and working ou of loops
    'pin': pins[cnt],
    'php': 0
   },
   success: function (result) {
      //console.log(result);
      $("#mode").append(result)
      cnt++;
      readPinMode();
   },
   error: function (xhr, textStatus, error) {
    console.log(xhr);
    console.log(textStatus);
    console.log(error);
   }
 });
}
$(function() { readPinMode(); }); 

概念证明:

var pins = ["pin1", "pin2", "pin3"];
var cnt = 0;

function readPinMode() {
  if (cnt >= pins.length) return;

  document.write('<br/>pin:' + pins[cnt]); // your Ajax

  cnt++;
  readPinMode();
}
$(function() {
  readPinMode();
});
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 告诉我你有多喜欢它;)
  • 不错的方法,但这仅适用于第一个元素!
  • 我非常喜欢它+1 :)
  • @Ghesio - 我需要更多关于它如何仅适用于第一个元素的详细信息。脚本停止了吗?有控制台消息吗?引脚数组的渲染看起来如何?请参阅概念证明。我在别针/别针中有错字
  • @mplungjan 脚本执行完毕,数组没问题。它只记录数组的第一个元素(来自 ajax 的console.log(result);),并且在控制台中没有其他错误。
【解决方案2】:

使用回调函数并没有错,但是您确实错过了一些事情。您忘记调用 initMode 函数,mode 应该是您提到的 ID:

<script>
    function readPinMode(callback, pin) {
        $.ajax({
            type: 'GET',
            url: 'SGWEB/header.php',
            data: {
                'funct': "readPinMode", //function included and working ou of loops
                'pin': pin,
                'php': 0
            },
            success: function (result) {
                callback(result);
            },
            error: function (xhr, textStatus, error) {
                console.log(error);
            }
        });
    }

    function initMode(mode, pin) {
        readPinMode(function (ret) {
            $(mode).text(ret);
        }, pin);
    }

    $(document).ready(function () {
        var pins = <?= json_encode($GLOBALS['gpio']) ?>;
        for (i = 0; i < pins.length; i++) {
            var mode = "#m" + pins[i];
            initMode(mode, pins[i]);
        }
    });
</script>

这是我创建的FIDDLE,以便您了解它的工作原理。

【讨论】:

  • 现在它有一个适当的关闭。 +1
【解决方案3】:

我认为它的语法错误,试试这个代码

console.log( "Document ready." );
  for (i = 0; i < pins.length; i++) {
        var mode = "m" + pins[i];       
        readPinMode(function(ret){
        console.log(ret);
        $(mode).text(ret);
        console.log(mode);
      }, pins[i]);       
  }

我删除了function initMode(),因为它一遍又一遍地创建相同的函数定义,覆盖了现有的函数,而且它很混乱。您不应该在循环中定义函数,因为最终函数将属于最后一个循环。在这种情况下,您也无需在循环内定义函数。

这是Working Prototype Fiddle

【讨论】:

  • 试过这段代码,它只适用于for的最后一次迭代
  • 你在控制台得到了什么??
  • 我只从 for 循环中得到最后一个 console.log(result);
  • @Ghesio 代码按预期 100% 工作。它循环正确,控制台有所有循环的输出。检查这个小提琴。 jsfiddle.net/RajReddy/u4fvw7Lg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2012-10-18
  • 2014-07-31
相关资源
最近更新 更多