在 SharePoint 中调用“SP.ClientContext.executeQueryAsync”的最佳/首选方式

2024-01-13

我一直在学习客户端对象模型并遇到了该方法executeQueryAsync http://msdn.microsoft.com/en-us/library/office/dn168907(v=office.15).aspx。我发现有很多方法可以调用这个方法。我发现的其中一些是:

var context = new SP.ClientContext.get_current();

// Option 1
context.executeQueryAsync(
    function(sender, args){ },
    function(sender, args){ }
);

// Option 2
context.executeQueryAsync(
    Function.createDelegate(this, _onSucceed), 
    Function.createDelegate(this, _onFail)
);

// Option 3
context.executeQueryAsync(
    Function.createDelegate(this, this._onSucceed), 
    Function.createDelegate(this, this._onFail)
);

// Option 4
context.executeQueryAsync(_onSucceed, _onFail);

哪种方式是最佳/首选的方式?还有什么声明Function.createDelegate做?这该函数的文档 http://msdn.microsoft.com/en-us/library/dd393582(v=vs.100).aspx对我来说似乎很神秘。


首先,我想说没有“最佳方式”,因为这些都表现得有些不同...其次,我想补充一点,这与其说是 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
});

以防万一有人关心! :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SharePoint 中调用“SP.ClientContext.executeQueryAsync”的最佳/首选方式 的相关文章

随机推荐