在调用函数(带有成功处理程序)之后,循环的执行停止

时间:2014-07-11 14:35:38

标签: javascript sharepoint

我在一个在函数(Function1)的成功处理程序中运行的循环中调用一个函数(Function2)。在循环的第一次迭代中,当我调用函数(Function2)时,调用该函数并执行opertation,如在被调用函数(Function2)的成功处理程序中指定的那样。但在此之后,控件不会转移到第一个函数(Function1)的成功处理程序中的循环,并且循环不再执行。下面的代码解释了这个场景:

function Function1()
{
    clientContext = SP.ClientContext.get_current();
    website = clientContext.get_web();
    var oList = web.get_lists().getByTitle('Test');
    var camlQuery = new SP.CamlQuery();
    this.collListItem = oList.getItems(camlQuery);
    clientContext.load(this.collListItem, 'Include(ID, LinkFilename, Sender, Created,  DocIcon)');
    clientContext.executeQueryAsync(
    Function.createDelegate(this, successHandler),
    Function.createDelegate(this, errorHandler)
    );

    function successHandler() {
        var itemsCount = this.collListItem.get_count();
        for (i = 0; i < itemsCount; i++) {
            var item = this.collListItem.itemAt(i);
            alert(item.get_fieldValues()["Created"]);
            Function2();
        }
    alert('Loop ends');
    }
    function errorHandler() {
    }
} 

现在功能2如下:

function Function2(){
    var context = SP.ClientContext.get_current();
    var web = context.get_web();
    var oList = web.get_lists().getByTitle('Test2');
    var camlQuery = new SP.CamlQuery();
    this.collListItem = oList.getItems(camlQuery);
    context.load(this.collListItem, 'Include(ID, BaseName, Created, ServerUrl)');
    context.executeQueryAsync(
    Function.createDelegate(this, success),
    Function.createDelegate(this, error)
    );
    function success() {
        var itemsCount = this.collListItem.get_count();
        for (i = 0; i < itemsCount; i++) {
            var item = this.collListItem.itemAt(i);
            alert(item.get_fieldValues()["ServerUrl"]);
        }
    }
    function error(){
    }
 }

现在我遇到的问题是,即使itemsCount大于1,代码也会在第一个函数的第一次循环中运行(之后是在循环下面写的代码(警报显示&#34;循环结束&#34;)甚至不执行)。 我无法发现什么是错的,你的建议非常受欢迎。请指导我完成这个。

1 个答案:

答案 0 :(得分:0)

以下是一些提示:

  1. 使用Chrome和开发者控制台(F12) - &gt; “网络”选项卡,用于查看请求的响应。
  2. 添加一些console.log语句,以查看是否正在调用您的函数但不总是达到成功回调。例如:
  3. function Function2() {
      console.log("Function2");
      var context = SP.ClientContext.get_current();
      var web = context.get_web();
      var oList = web.get_lists().getByTitle('Test2');
      var camlQuery = new SP.CamlQuery();
      this.collListItem = oList.getItems(camlQuery);
      context.load(this.collListItem, 'Include(ID, BaseName, Created, ServerUrl)');
      context.executeQueryAsync(
          Function.createDelegate(this, success),
          Function.createDelegate(this, error)
      );
    
      function success() {
          var itemsCount = this.collListItem.get_count();
          for (i = 0; i < itemsCount; i++) {
              var item = this.collListItem.itemAt(i);
              alert(item.get_fieldValues()["ServerUrl"]);
          }
      }
    
      function error(sender, args) {
          console.log("Request failed: " + args.get_message() + ". " + args.get_stackTrace());
      }
    }
    

    确保在使用console.log时打开了开发人员工具,因为这些语句会在关闭开发人员工具的IE中导致错误。