【问题标题】:javascript: executing order of function - nested function return value before function finishes processing?javascript:函数的执行顺序 - 函数完成处理之前的嵌套函数返回值?
【发布时间】:2013-02-01 14:07:23
【问题描述】:

我刚刚学习 JavaScript,对于像我这样的人来说,似乎有很多关于它异步处理函数方式的信息。

虽然我仍在努力解决这个问题,但由于我正在尝试做的事情,我发现自己正在努力解决一些共享点 csom。也许我只是在做这个完全错误的事情,但正如我所说,只是在学习。

尝试使用 SP CSOM 来获取这样的列表数据:

getGridData() {
    var gridURL = "https://mySite/ListData.svc/Projects";
    var request = new Sys.Net.WebRequest();
    request.set_httpVerb("GET");
    request.set_url(gridURL);
    request.get_headers()["Accept"] = "application/json";
    request.add_completed(onCompletedProjectCallback);
    request.invoke();
}

onCompletedProjectCallback(response, eventArgs) {
      var getProject = eval("(" + response.get_responseData() + ")");
      var buildMarkUp = '';
      for (var i = 0; i < getProject.d.results.length; i++)  {
         buildMarkUp += "<div>" + getProject.d.results[i].ProjectName + "</div>";
      }
}

这很好用。

我确实知道其他方法,例如 spservices,但我喜欢这种方法,因为它对我来说似乎更快并且返回 JSON 更可取。

当我想使用上面的ProjectID 调用另一个函数并传递 id 以从列表中获取相关值时会发生什么。

但是,我想在添加到 DOM 之前按顺序构建 buildMarkUp 字符串(哦,是的,jQuery 顺便说一句)。像这样的事情可能是完全错误的,但这是我想要做的:

onCompletedProjectCallback(response, eventArgs) {
      var getProject = eval("(" + response.get_responseData() + ")");
      var buildMarkUp = '';
      for (var i = 0; i < getProject.d.results.length; i++)  {
         buildMarkUp += "<div>" + getProject.d.results[i].ProjectName + "</div>";

      //call nested function here so that I can go retrieve values for each ProjectID from another list
       var getOtherData = getRelatedData(getProject.d.results[i].ProjectID);
      }
}


getRelatedData(passedProjectID) {
     // have to use the same method as the original to get more sharepoint list data
      var relatedURL = "https://mySite/ListData.svc/Related$filter=ProjectID eq " + passedProjectID;
    var request = new Sys.Net.WebRequest();
    request.set_httpVerb("GET");
    request.set_url(relatedURL);
    request.get_headers()["Accept"] = "application/json";
    request.add_completed(onCompletedRelatedCallback);
    request.invoke();
}

不过,这正是我真正苦苦挣扎的地方。

单独的回调意味着如果我返回正确,它不会返回到带有数据的原始函数?
原始函数是否继续处理并仅触发嵌套函数?
那么如何控制何时/如何/将哪些值返回给原始函数?可以吗?

如果我试图构建一个表,其中每个引用的项目行都包含来自其他共享点列表的数据,并且我需要控制我要附加到 DOM 的字符串的构建顺序,我该怎么办?

【问题讨论】:

  • var getProject = eval("(" + response.get_responseData() + ")"); 你在那儿干什么?
  • @Cerbrus:他试图解析 JSON。 @OP:使用JSON.parse!!!
  • @Bergi ..尝试听从您的建议,但以上是我从中学到的方法,我很难找出如何使用 JOSN.parse 而不是上面的方法。
  • nm 这实际上很容易......我的错误

标签: javascript jquery function asynchronous


【解决方案1】:

您是正确的,执行 Web 请求的函数会立即继续并且无法从该调用返回数据。您需要对回调进行编码,以将它们收集的数据添加到公共数据结构中——也许创建一个将数据累积为新属性的对象。当您收集了所有数据后,最后一个回调可以构建 HTML 元素。如果您同时执行多个 AJAX 请求,则每个回调都可以调用一个通用函数来查看是否所有请求都已完成。例如:

function checkLoadingComplete() {
    if (loadedData.project && loadedData.relatedData && loadedData.summaryData) {
         //now build the HTML elements
    }
}

【讨论】:

  • 谢谢。显然我只需要了解更多关于回调的信息。赞赏。
  • @Justin:还可以看看 Deferreds/Promises,它为处理回调提供了更好的接口
  • @Bergi:我会...感谢您的帮助/指导。
【解决方案2】:

单独的回调意味着如果我返回正确,它不会返回原始函数并返回数据?

是的。 return 从正在执行的函数返回,但不等待 ajax 加载事件及其处理程序获取数据。

原始函数是否继续处理并仅触发嵌套函数?

是的。它启动一堆 ajax 请求,并为每个请求返回 undefined

那么我如何控制何时/如何/将哪些值返回给原始函数?可以吗?

您将需要使用回调,您永远不会“return”这些值。

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 2018-02-08
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多