मैं 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 उत्तर
प्रत्येक खोज परिणाम पंक्ति के अनुसार वादा वापस करने का एक बेहतर विकल्प होगा:
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));
});
संबंधित सवाल
नए सवाल
jquery
jQuery एक जावास्क्रिप्ट लाइब्रेरी है, जावास्क्रिप्ट टैग को जोड़ने पर भी विचार करें। jQuery एक लोकप्रिय क्रॉस-ब्राउज़र जावास्क्रिप्ट लाइब्रेरी है, जो दस्तावेज़ ऑब्जेक्ट मॉडल (DOM) ट्रैवर्सल, इवेंट हैंडलिंग, एनिमेशन और AJAX इंटरैक्शन को ब्राउज़रों की विसंगतियों को कम करके सुविधाजनक बनाता है। JQuery से संबंधित एक प्रश्न jQuery से संबंधित होना चाहिए, इसलिए jQuery को प्रश्न में कोड द्वारा उपयोग किया जाना चाहिए और कम से कम jQuery के उपयोग से संबंधित तत्वों को प्रश्न में होना चाहिए।
done
के बजायthen
का उपयोग करना चाहिए, ताकि श्रृंखलित हो सके।