jquery - 嵌套的jquery延迟调用—不确定如何编写最终 rest/ajax调用

  显示原文与译文双语对照的内容
65 3

我已经在可以编辑表中添加了一个SharePoint表单,允许用户从表单中的子项添加。编辑和删除项。

为了管理这个问题,我重写提交功能,运行使用AJAX和 SharePoint REST API 在子列表提交表单之前的代码。

提交覆盖的部分 cod:


$.when(bulkInsert(arrayOfNew, parentId)
).then(function() { 
 $.when(bulkUpdate(arrayOfUpdates,parentId)
 ).then(function() {
 alert("all done");
//run initial submit
 });
});

bulkInsert和bulkUpdate都工作相同,问题是最终嵌套 rest/ajax调用,所以只显示 updateItems 。


function bulkUpdate(updates, parentId) {
 var deferred = $.Deferred();
 var promises= [];
 $.map(updates, function (item) {
 promises.push(updateItem(parentId, item))
 })

 $.when.apply($, promises).then(function () { deferred.resolve(); });
 return deferred.promise();
}

我相信我的代码是正确的。

要使用 SharePoint REST API 更新项,我必须首先获取该项的RequestDigest和 REST URI,因这里最后的AJAX调用将嵌套在。 我尝试了几件事并且没有工作,因这里我只是展示了工作代码,希望有人能够向我展示这个脚本。


function updateItem(parentId, childItem) {
 getItem(childItem.Id, function (data) {
//complete function
 var updateItem = {
"__metadata": {"type":"SP.Data.ChildListItem" },
"LookupID": parentId,
"Field1": item.Field1,
"Field2": item.Field2,
"Field3": item.Field3//etc.
 };

 $.ajax({
 url: data.d.results[0].__metadata.uri,
 type:"POST",
 contentType:"application/json;odata=verbose",
 data: JSON.stringify(updateItem),
 headers: {
"Accept":"application/json;odata=verbose",
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
"X-HTTP-Method":"MERGE",
"If-Match": data.d.results[0].__metadata.etag
 },
 success: function (data) {
 alert("update succesful");
//
 },
 error: function (data) {
 alert(JSON.stringify(data));
 }
 });
 }, function (data) {
//failure function
 alert(JSON.stringify(data));
 });
 }

function getItem(childId, complete, failure) {
 $.ajax({
 url: (_spPageContextInfo.webServerRelativeUrl =="/"?"" : _spPageContextInfo.webServerRelativeUrl) +"/_api/web/lists/getbytitle('ChildList')/items?select=ID&$filter=ID eq" + childId,
 method:"GET",
 headers: {"Accept":"application/json; odata=verbose" },
 success: function (data) {
//Returning the results
 alert("got item");
 complete(data);
 },
 error: function (data) {
 failure(data);
 }
 });
}

感谢你的帮助。

时间: 原作者:

84 0

首先,主例程应简化如下:


bulkInsert(arrayOfNew, parentId).then(function() {
 bulkUpdate(arrayOfUpdates, parentId).then(function() {
 alert("all done");
//run initial submit
 });
});

我不确定在哪里,它从哪里来? 是由 bulkInsert 生成的?

然后,可以将 bulkUpdate 简化为:


function bulkUpdate(updates, parentId) {
 var promises = $.map(updates, function(item) {
 return updateItem(parentId, item);
 });
 return $.when.apply($, promises);
}

然后,updateItem 必须返回一个承诺,并且可能会从内部重构中受益,如下所示:


function updateItem(parentId, childItem) {
 function getItem(id) {
//Note the `return`
 return $.ajax({
 url: (_spPageContextInfo.webServerRelativeUrl =="/"?"" : _spPageContextInfo.webServerRelativeUrl) +"/_api/web/lists/getbytitle('ChildList')/items?select=ID&$filter=ID eq" + id,
 method:"GET",
 headers: {"Accept":"application/json; odata=verbose" },
 });
 }
 function update(data) {
 var requestData = {
"__metadata": {"type":"SP.Data.ChildListItem" },
"LookupID": parentId,
"Field1": item.Field1,
"Field2": item.Field2,
"Field3": item.Field3//etc.
 };
//Note the `return`
 return $.ajax({
 url: data.d.results[0].__metadata.uri,
 type:"POST",
 contentType:"application/json;odata=verbose",
 data: JSON.stringify(requestData),
 headers: {
"Accept":"application/json;odata=verbose",
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
"X-HTTP-Method":"MERGE",
"If-Match": data.d.results[0].__metadata.etag
 }
 });
 }

//Closure-forming utility for success/error reporting
 function reportAjaxStatus(prefix) {
 return function (x, textStatus) {
 var message = (prefix || '-') + (textStatus || '-');
 alert(message);
 }
 }

//Master routine (simplify when debugged)
//Note the `return`
 return getItem(childItem.Id)
. always(reportAjaxStatus('getItem: '))
. then(update)
. always(reportAjaxStatus('update: '));
}

这使得一个简洁。可以读的主例程,控制所有成功/错误报告,并且在调试时简化。

原作者:
141 4

updateItem() 不返回承诺。


function updateItem(parentId, childItem) {
 var def = $.Deferred();

 getItem(childItem.Id, function (data) {

 $.ajax({
 success: function (data) {
 def.resolve(true);
 },
 });

 });

 return def.promise();
 }

原作者:
...