मैं SharePoint में एक एप्लिकेशन बना रहा हूं जिसके लिए तीन अलग-अलग AJAX अनुरोध करने की आवश्यकता है:

  • खाता आईडी (खोज उपयोगकर्ता) के लिए विशिष्ट कार्य शीर्षक वाले सभी लोगों के लिए खोज API को कॉल करें।
  • SearchUsers (getUserProps) में पुनर्प्राप्त किए गए प्रत्येक खाते के नाम का उपयोग करके उपयोगकर्ता प्रोफ़ाइल API के लिए एक कॉल।
  • getUserProps (एक दूसरा getUserProps) में पुनर्प्राप्त प्रबंधक के खाते के नाम का उपयोग करते हुए, प्रत्येक उपयोगकर्ता के प्रबंधक के नाम के लिए उपयोगकर्ता प्रोफ़ाइल API के लिए दूसरी कॉल।

ऊपर मैंने जिन तीन ऑपरेशनों को संक्षिप्त किया है, वे एक कस्टम लाइब्रेरी का हिस्सा हैं, जिसे मैं अजाक्स ऑब्जेक्ट्स को बार-बार लिखने से कुछ भारी उठाने के लिए लिख रहा हूं। सुनिश्चित नहीं है कि आप सभी को कितनी लाइब्रेरी देखने की आवश्यकता है, और मैं इस प्रश्न को कोड के एक समूह के साथ बकवास नहीं करना चाहता था, इसलिए मैंने पुस्तकालय के ऑपरेटिव भागों को यह jsfiddle

तो, यह ज्यादातर मुझे आस्थगित वादों और अजाक्स के ins और बहिष्कार (और शायद पूरी भाषा, सामान्य रूप से) की खराब समझ है। लेकिन अगर यह संभव है, तो मैं उपरोक्त कार्यों का समूह किए बिना उपरोक्त करना चाहता हूं। या यह जानने के लिए कि इसे पूरा करने का सबसे अच्छा अभ्यास/सबसे प्रभावी तरीका क्या है।

अपडेट करें
वादिम ग्रीम्याचेव के सुझावों के आधार पर, मैंने jQuery.when दृष्टिकोण अपनाया:

searchPeople().then(function(result){

    //prepare promises 
    var promises = result.items.map(function(q){
        return getUserProps(q.Manager);
    });

    //resolve for each of the promises
    $.when.apply($, promises).then(function(){
        console.log('Promises resolved.')
    });

})
.fail(function(error){
    console.log(JSON.stringify(error));  
});

function searchPeople(){
    var api = new ApiHelper('https://sharepoint/sites/subsite');

    var options = {
        query:'Job Title',
        props:['Manager']
    };        
    return api.searchUsers(options);
}

function getUserProps(account){
    var api = new ApiHelper('https://sharepoint/sites/subsite');
    var encName = encodeURIComponent(account);
    return api.getUserProperties(encName);
}

$.when.applyलाइन में आप देखेंगे कि मुझे अभी-अभी एक कंसोल शाउट मिला है। ऐसा इसलिए है क्योंकि मुझे हल करने के वादे नहीं मिल रहे हैं। मैं देख सकता हूं, डेवलपर टूल में, मेरे सभी getUserProperties कॉल चल रहे हैं। लेकिन वे कभी हल नहीं करते, कि "वादे हल हो गए" कॉल कभी नहीं आती।

मदद?

1
ChrisPEditor 5 मई 2016, 23:11
1
आपको हमेशा done के बजाय then का उपयोग करना चाहिए, ताकि श्रृंखलित हो सके।
 – 
Bergi
10 मई 2016, 00:21

1 उत्तर

सबसे बढ़िया उत्तर

प्रत्येक खोज परिणाम पंक्ति के अनुसार वादा वापस करने का एक बेहतर विकल्प होगा:

api.searchUsers(options).done(function(data){
   var admins = data.items;
   var promises = admins.map(function(item){
       var accountName = admins[i].AccountName;
       return getUserProperties(accountName);
   });


});

और फिर jQuery.when() का उपयोग करके सभी वादों को हल करें:

$.when.apply($, promises).then(function () {
      for (var i = 0; i < arguments.length; i++) {
        var profileProperties = arguments[i][0];  
        console.log(profileProperties.DisplayName);
      }
   }); 

उदाहरण

function searchPeople()
{
    var requestUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/search/query?querytext='*'&sourceid='b09a7990-05ea-4af9-81ef-edfab16c4e31'";
    return $.getJSON(requestUrl);
}



function getUserProperties(account){
    var encName = encodeURIComponent(account);
    var requestUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='" + encName + "'";
    return $.getJSON(requestUrl);
}


searchPeople()
.then(function(result){

   //prepare promises 
   var promises = result.PrimaryQueryResult.RelevantResults.Table.Rows.map(function(r){
       var accountName = r.Cells[3].Value;
       return getUserProperties(accountName);
   });

   //resolve for each of the promises
   $.when.apply($, promises).then(function () {
      for (var i = 0; i < arguments.length; i++) {
        var profileProperties = arguments[i][0];  
        console.log(profileProperties.DisplayName);
      }
   });

})
.fail(function(error){
   console.log(JSON.stringify(error));  
});
1
Vadim Gremyachev 9 मई 2016, 16:37
1
यह शानदार है और ठीक वही है जिसकी मुझे तलाश थी। जैसे ही मुझे पता चलता है कि प्रक्रिया में एक और AJAX अनुरोध कैसे लोड किया जाए, मैं अपने प्रश्न को अंतिम उत्पाद के साथ संपादित कर दूंगा। आपको धन्यवाद!
 – 
ChrisPEditor
9 मई 2016, 21:14
... और मैं इसे काम पर नहीं ला सका। ऊपर मेरा कोड अपडेट किया गया।
 – 
ChrisPEditor
10 मई 2016, 15:24