【发布时间】:2017-02-20 02:57:50
【问题描述】:
我正在使用 Sharepoint,并且我有一个在网站集中创建列表的应用程序(不是应用程序!)。创建列表不是问题。 我不想创建 15 列并将它们添加到默认视图。我准备了一个包含列表及其字段信息的“配置”。
var ChangeRequestLogListConfig = {
listName: 'ChangeRequestLog',
fields: [
{ 'FieldTypeKind': 8, 'Title': 'STC Relevant', 'InternalName': 'STCrelevant', 'StaticName': 'STCrelevant' },
{ 'FieldTypeKind': 3, 'Title': 'Description/Reason', 'InternalName': 'DescriptionReason', 'StaticName': 'DescriptionReason' },
{ 'FieldTypeKind': 6, 'Title': 'Source of Change', 'InternalName': 'SourceOfChange', 'StaticName': 'SourceOfChange', 'Choices': { 'results': ['customer', 'internal'] } },
//12 more objects like the above
]
}
问题来了:其余资源 .../ViewFields/AddViewField 和 .../fields(使用 http 帖子创建新资源)仅支持一个参数,这意味着我必须进行 2x15 次 ajax 调用。
执行所有这 30 个操作然后执行最终回调的正确方法是什么?当然我知道如何遍历字段数组,但我根本不知道如何以正确的方式构建最终回调。
更新/跟进
在一些答案的帮助下,我设法构建了以下代码:
var spExecutor = new SP.RequestExecutor(_spPageContextInfo.siteAbsoluteUrl);
var requestUrl = _spPageContextInfo.siteAbsoluteUrl + "/_api/SP.AppContextSite(@target)/web/Lists/getbytitle('" + listConfig.listName + "')/fields?@target='" + hostWebUrl + "'";
//map field configs to promises
var promises = listConfig.fields.map(fieldConfig => {
return spExecutor.executeAsync({
url: requestUrl,
method: "POST",
body: JSON.stringify(fieldConfig),
headers: {
"accept": "application/json;odata=verbose",
"content-type": "application/json; odata=verbose"
},
error: err => console.log(err)
});
});
//Wait for all calls to be done
$.when.apply($, promises).then(callbackFn);
您可能已经看到,我使用的不是$.ajax,而是SP.RequestExecutor。
问题:这不会以与 jQuery 的 ajax 相同的方式返回 Promise。这会导致时间问题(--> 一次调用 15 个,浏览器大多只支持 4 个并行调用)。上面的代码有效,如果我设置断点并在调用之间等待 1-2 秒,它会按预期创建所有字段。
我的后续问题:如何等待第一个调用完成以初始化第二个,然后是第三个,依此类推? 我不确定我是否以正确的方式使用承诺。
【问题讨论】:
-
你不能把它捆绑成更少的请求吗?提交任务列表供服务器完成,然后响应一个大响应?
-
您可以将每个调用包装在一个 promise 中,然后调用
Promise.all([p1, p2, ...])。Promise.all的结果将是一个数组,每个项目都是每个 ajax 调用的结果。 -
@EmilS.Jørgensen 不,正如所说的,端点当时只允许一个。 @NickSalloum 我该怎么做?
var responses = Promise.all(...)? p1,p2 会是什么? -
@Sandrooco 他们也是承诺:developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
标签: javascript jquery ajax promise deferred