在执行内部动作之前,函数正在返回值

时间:2019-03-13 17:33:59

标签: javascript jquery ajax sharepoint

使用SharePoint的PreSaveAction()(在单击“保存”按钮时触发),我试图在保存表单之前运行检查和操作字段。如果PreSaveAction()返回true,该表单将被保存并关闭。

function PreSaveAction() {
  var options = {
    "url": "https://example.com/_api/web/lists/getbytitle('TestList')/items",
    "method": "GET",
    "headers": {
      "Accept": "application/json; odata=verbose"
    }
  }

  $.ajax(options).done(function (response) {
    var actualHours = response.d.results[0].ActualHours
    var personalHours = $("input[title$='Personal Hours']").val();
    var regex = /^\d*\.?\d+$/ // Forces digit after decimal point

    if (personalHours && regex.test(personalHours)) { // Run if input is not blank and passes RegEx
      if (response.d.results[0].__metadata.etag.replace(/"/g, "") == $("td .ms-descriptiontext")[0].innerText.replace("Version: ", "").split('.')[0]) {
        // Run if item's data from REST matches version shown in form
        addChildItem(id, title, personalHours, actualHours)
      }
    }
  });
  return true; // firing before request above begins
}

该函数在运行jQuery AJAX调用之前返回为true,该调用运行addChildItem(),该调用处理表单中的字段并将相关数据发布到单独的列表中。

function addChildItem(id, title, personalHours, actualHours) {
  $.ajax({
    method: "POST",
    url: "https://example.com/_api/web/lists/getbytitle('ChildList')/items",
    data: JSON.stringify({
      __metadata: {
        'type': 'SP.Data.ChildListListItem'
      },
      ParentID: id,
      Title: title,
      HoursWorked: personalHours
    }),
    contentType: "application/json;odata=verbose",
    headers: {
      "Accept": "application/json; odata=verbose",
    },
    success: function (data) {
      console.log("success", data);
      var actualHoursNum = Number(actualHours);
      var personalHoursNum = Number(personalHours);
      $("input[title$='Actual Hours']").val(actualHoursNum + personalHoursNum);
      $("input[title$='Personal Hours']").val('');
      // Input is getting cleared on save but shows previous number when form is opened again
    },
    error: function (data) {
      console.log("error", data);
    }
  });
}

这导致表单接受字段值操作,但仅在保存之后以及表单自动关闭之前接受。

我需要PreSaveAction()等待addChildItem()成功返回true之后,但我不确定如何执行此操作。我尝试使用名为returnedStatus的全局变量,该变量在addChildItem()成功时会更新,但在运行jQuery AJAX调用之前仍会查看PreSaveAction()中的返回值。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

通过设置async: false将用户添加到PreSaveAction中的组中,我得到了类似的情况。

Original thread

<script language="javascript" type="text/javascript">

        function PreSaveAction() {
            var check = false;
            var controlName = 'MultiUsers';
            // Get the people picker object from the page.
            var peoplePickerDiv = $("[id$='ClientPeoplePicker'][title='" + controlName + "']");
            var peoplePickerEditor = peoplePickerDiv.find("[title='" + controlName + "']");
            var peoplePicker = SPClientPeoplePicker.SPClientPeoplePickerDict[peoplePickerDiv[0].id];            
            if (!peoplePicker.IsEmpty()) {
                if (peoplePicker.HasInputError) return false; // if any error
                else if (!peoplePicker.HasResolvedUsers()) return false; // if any invalid users
                else if (peoplePicker.TotalUserCount > 0) {
                    // Get information about all users.
                    var users = peoplePicker.GetAllUserInfo();                                     
                    for (var i = 0; i < users.length; i++) {
                        console.log(users[i].Key);
                        var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/sitegroups(22)/users";
                        $.ajax({
                            url: requestUri,
                            type: "POST",
                            async: false,
                            data: JSON.stringify({ '__metadata': { 'type': 'SP.User' }, 'LoginName': '' + users[i].Key + '' }),
                            headers: {
                                "accept": "application/json;odata=verbose",
                                "content-type": "application/json;odata=verbose",
                                "X-RequestDigest": $("#__REQUESTDIGEST").val()
                            },
                            success: function(data) {
                                console.log('User Added');
                                check = true;
                            },
                            error: function (error) {
                                console.log(JSON.stringify(error));
                                check = false;
                            }
                        });                                                
                    }                    
                }
            } else {
                console.log('No user');
            }
            return check;
        }                
    </script>