如何调用结合或同时调用这两个功能?

时间:2019-10-16 13:56:56

标签: javascript sharepoint-2013

我正在尝试检查当前用户是否是正在编辑的记录的所有者,如果是,我将允许编辑,否则,我将阻止编辑。我有两个函数分别让我成为当前用户和创建记录的用户。由于存在不同的依赖性,因此将它们分别称为。如何将它们组合成一个功能。 根据下面的注释和一些调试,我将代码重构为使用promise.all。现在,它可以正常运行,并且是如何编码的示例。

我的代码如下:

<!-- Download SPServices from: //spservices.codeplex.com/  -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.SPServices/2014.02/jquery.SPServices-2014.02.min.js"></script>
<script type="text/javascript">

$(document).ready(function() {
   //don't exectute any jsom until sp.js file has loaded.          
   SP.SOD.executeFunc('sp.js', 'SP.ClientContext', StartProcess);
});

function StartProcess() {  
    var selectedValue = $("h3:contains('Request Phase')").closest('tr').find('select').val();
    if (selectedValue == 'New') {
        const DataFetch = Promise.all([
            makeFirstCall().catch(error => {
                return "error";
            }),
            makeSecondCall().catch(error => {
                return "error";
           })
        ]).then(resolvedData => {
            // do something with resolved data
            console.log('resolvedData='+resolvedData);
        }).catch(error => {
            console.error(error)
           })
        console.log('Succces');
    }
}

const makeFirstCall = () => {
  return new Promise(function(resolve, reject) {
    //console.log('makeFirstCall');
    // make your call
    getCurrentUser().then(
        function (currentUser) {
            var loginId = currentUser.get_id();
            //console.log('Current user ID='+loginId);
            resolve(loginId);
        }
     );
  });
}
const makeSecondCall = () => {
  return new Promise(function(resolve, reject) {
    console.log('makeSecondCall ');
    // make your call
    retrieveListItems().then(
        function (requestUser) {
            //var loginId = requestUser.get_id();
            console.log('requestUser user ID='+requestUser);
            resolve(requestUser);
        }
    );
  });
}

function getCurrentUser()
{
   //Declare your deferred object here  
   //console.log('getCurrentUser');
   var deferred=$.Deferred();  
   var ctx = new SP.ClientContext.get_current();
   this.website = ctx.get_web();
   this.currentUser = website.get_currentUser();
   ctx.load(currentUser);
   ctx.executeQueryAsync(Function.createDelegate(this,
                                                        function () { deferred.resolve(currentUser); }),
                                         Function.createDelegate(this,
                                                       function (sender, args) { deferred.reject(sender, args); })
   );
   //console.log('END-getCurrentUser');
   //Return your Promise Object  
   return deferred.promise();  
}
function retrieveListItems()
{
   //Declare your deferred object here  
   console.log('retrieveListItems');
   var deferred=$.Deferred();  
   var ctx = new SP.ClientContext.get_current();
   // Get ID of the current item.
   var currentItemID = window.location.href.toLowerCase();
   currentItemID = currentItemID.substring(currentItemID.toLowerCase().indexOf("?id=") + 4,
                                                                     currentItemID.toLowerCase().indexOf("&source="));
   console.log('currentItemID='+currentItemID);
   var oList = clientContext.get_web().get_lists().getByTitle('BSMRequests');
   var camlQuery = new SP.CamlQuery();
   camlQuery.set_viewXml('<View><Query><Where><Eq><FieldRef Name=\'ID\'/><Value Type=\'Text\'>'+ currentItemID+
                                          '</Value></Eq></Where></Query></View>'); 
   collListItem = oList.getItems(camlQuery);
   ctx.load(collListItem);
   //var loginId = "66";
   //deferred.resolve(loginId); 
   ctx.executeQueryAsync(Function.createDelegate(this,function () {
                                                        var listItemEnumerator = collListItem.getEnumerator();
                                                        while (listItemEnumerator.moveNext()) {
                                                            var oListItem = listItemEnumerator.get_current();
                                                            console.log('Record id='+oListItem.get_item('ID'));
                                                            requestorID = oListItem.get_item('Requestor_x0020_Name').get_lookupId();
                                                            console.log('requestorID='+requestorID );
                                                        }
                                                        deferred.resolve(requestorID);
                                                        }),
                                         Function.createDelegate(this,function (sender, args) { deferred.reject(sender, args); })
   );
   console.log('END-retrieveListItems');
   //Return your Promise Object  
   return deferred.promise();  
}
</script>

我的代码将返回两个id,然后一个可以使用它们完成它们想要的操作。这些ID位于数组中,因此比较它们可以解决问题。

console.log('Userid: '+resolvedData[0]+'=? Userid: '+resolvedData[1]);

1 个答案:

答案 0 :(得分:1)

您好,您可以将两个调用都变成promises并使用promise.all来获得响应。这样,您就可以等待两个结果。

const DataFetch = Promise.all([
  makeFirstCall().catch(error => {
    return "error";
  }),
  makeSecondCall().catch(error => {
    return "error";
  })
]).then(resolvedData => {
 // do something with resolved data
}).catch(error => {
console.error(error)
})

要实现promise功能,您可以执行以下操作:

const makeFirstCall = () => {
  return new Promise(function(resolve, reject) {
    // make your call
    reject(new Error(`error message`)); // if error
    resolve(dataFromCall);

  });
}