JavaScript:执行函数顺序 - 在函数完成处理之前嵌套函数返回值
javascript: executing order of function - nested function return value before function finishes processing?
我只是在学习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 以便从列表中获取相关值时会发生什么。
但是,我想在将buildMarkUp
字符串附加到 DOM 之前按顺序构建它(哦,是的,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();
}
不过,这是我真正挣扎的地方。
单独的回调意味着如果我返回,它不会返回到带有数据的原始函数,对吗?
原始函数是否继续处理并仅触发嵌套函数?
那么如何控制何时/如何/哪些值返回给原始函数?我可以吗?
基本上,如果我尝试构建一个表,其中每个引用的项目行都包含来自其他 sharepoint 列表的数据,并且我需要控制要附加到 DOM 的字符串的生成顺序,该怎么办?
您是正确的,执行 Web 请求的函数会立即继续,并且无法从该调用返回数据。您需要对回调进行编码,以将它们收集的数据添加到公共数据结构中 - 也许创建一个对象,将数据累积为新属性。收集完所有数据后,最后一个回调可以生成 HTML 元素。如果您同时执行多个 AJAX 请求,则每个回调都可以调用一个公共函数来查看是否所有请求都已完成。例如:
function checkLoadingComplete() {
if (loadedData.project && loadedData.relatedData && loadedData.summaryData) {
//now build the HTML elements
}
}
单独的回调意味着如果我返回,它不会返回到带有数据的原始函数,对吗?
是的。 return
从执行函数返回,但不等待 ajax load 事件及其处理程序获取数据。
原始函数是否继续处理并仅触发嵌套函数?
是的。它启动一堆 ajax 请求,并为每个请求获取undefined
。
那么如何控制何时/如何/哪些值返回给原始函数?我可以吗?
您将需要使用回调,您永远不会"return
"值。
- 如何让 AJAX 函数处理提交表单
- Jquery onmouseover()函数处理动态html图像和span
- 如何在ajax调用完成之前停止函数处理
- 如何跨多个函数处理Promise
- JavaScript 函数中的 JQuery 函数 :: 处理.js.
- 覆盖 jquery .load() 函数 - 处理回调
- 调用 Javascript 函数处理表单后,HTML 表单未打印到浏览器
- 如果选中单选按钮,则调用函数处理程序
- 我们如何在错误的资源请求的情况下使用 XMLHttpRequest 函数处理程序
- Javascript 对象或函数处理程序的新函数
- 函数处理 mootools.floor 不工作
- 如何将函数处理程序从控制器传递到 AngularJs 中的指令隔离范围
- Javascript闭包和前后函数处理程序
- position()被当作函数处理
- 存储/导入变量&函数处理(JS)
- 如何使用Out回调函数处理JQueryAjax结果
- 在事件上填充数组,并在事件函数处理程序外部访问它
- 如何在JavaScript中从嵌套函数处理程序返回
- 用一个函数处理多个事件
- 通过单个javascript函数处理两个表单