首先,我想说没有“最佳方式”,因为这些都表现得有些不同...其次,我想补充一点,这与其说是 SharePoint 或 executeQueryAsync 特定的东西,不如说它是一般的 JS 东西...
接下来我们需要明白的是executeQueryAsync
需要两个函数作为参数:第一个是执行 if 的函数executeQueryAsync
成功后,第二个是方法遇到错误时要执行的函数。这些函数传递参数(来自executeQueryAsync
,而不是来自您的 JS)代表发送对象以及可以包含一些数据的参数对象(args.get_message()
and args.get_stackTrace()
常见于呼叫失败的情况)
在您的“选项 1”示例中,executeQueryAsync
给定两个匿名函数,您将无法在任何地方重复使用它们,但如果行为很简单,这可能就足够了。
在选项 2 中,您使用createDelegate
为成功和失败回调提供上下文的方法——这涉及 JavaScript 中的作用域;如果您需要引用只能在调用的函数中访问的变量executeQueryAsync
,你需要使用这种模式,以便this
在回调中引用调用的函数executeQueryAsync
而不是您现在所在的成功或失败函数。您可以将创建委托作为调用其他函数的调用函数,但说“我希望该函数能够看到我可以看到的内容,无论在哪里它位于代码内。这可能看起来有点神秘,但这就是 JavaScript 中的作用域...您可以通过引用更高作用域级别的变量(例如在包含调用方法以及成功和成功的函数内部)来完全避免这样做的需要。失效方法)
选项 3 与选项 2 类似,只不过它只是指定_onSucceed
or _onFail
函数应该是包含在调用对象中的函数
选项 4 与选项 1 类似,不同之处在于您已命名函数(并且它们在当前作用域内可用)并按名称调用它们。
我通常使用选项 2 或选项 4 之类的东西 - 但我希望您能看到它实际上只取决于您尝试构建代码的方式。
编辑:
回应有关的评论Function.createDelagate()
-- 它似乎只是 ASP.NET 脚本资源中的一个助手;它除了调用之外什么也不做apply()
(这是执行此操作的标准 JS 方式 -请参阅此处的 MDN 文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)。它还可能在 ASP.NET 中的某个地方提供一些向后兼容性,但我不太确定!
以下是我的 SP 环境中脚本资源文件中的函数代码:
Function.createDelegate = function(a, b) {
return function() {
return b.apply(a, arguments)
}
};
作为奖励,我正在考虑如何使用executeQueryAsync
我意识到我实际上更频繁地使用它,就像选项 1 一样,使用 jQuery 延迟的 Promise 模式,如下所示:
function getSPDataAsync(context) {
var deferred = $.Deferred();
context.executeQueryAsync(function(sender, args) {
deferred.resolve(sender, args);
}, function(sender, args) {
deferred.reject(sender, args);
});
return deferred.promise();
}
然后你可以做一些不像意大利面条那样的事情,例如:
...
ctx.load(items);
getSPDataAsync(ctx).then(function() {
//do some stuff with the data when the promise resolves
});
以防万一有人关心! :)