Na temat odpowiadaj w postach.
Tak - w JS, z racji jego jednowątkowej natury, nie stosuje się zwyczajowo czekania na zakończenie zadań asynchronicznych, tylko wykorzystuje Promise / callbacki, lecz wymaga to odpowiednich dostosowań w kodzie.
Pokaż jak próbowałeś.
Cześć,
Nie pamiętam czy to dokładnie tak wyglądało. Odtwarzałem to na szybko i wydaje mi się że mój kod wyglądał następująco. Na formularzu SharePoint masz przycisk Save i kiedy go klikasz jesteś w stanie podpiąć się pod funkcję PreSaveAction() z własnym kodem. Jeżeli zwróci true SharePoint przechodzi na validację po stronie serwera i tam waliduje własne kontorolki czyli sprawdza ich wymagalność i prawidłowość formatu etc. i zapisuje element jeżeli wszystko jest ok. Jeżeli wynik funkcji PreSavaAction jest na false to zatrzymuje się i wtedy możesz pokazywać komunikaty etc.
Więc W funkcji PreSavaAction mam call do SharePoint (to jest jakiś tam rest nie do końca taki był ale działał prawidłowo ale po czasie kończyło się wykonanie tego wątku i dlatego zawsze miałem false.
function PreSaveAction() {
console.log('PreSaveAction');
var resultat=null;
var deffered = $.Deferred();
$.when(ValideForm())
.done(function (resultVF) {
resultat=resultVF; //TU FAKTYCZNIE MAM TRUE albo FALSE ale nie wiem jak wyjść, aby było true do głównej funkcji
deffered.resolve(resultat);
});
return deffered.promise();
}
function ValideForm() {
var deffered1 = $.Deferred();
var url = appWebUrl + "/_api/SP.AppContextSite(@Target)/web/lists/getbytitle('" + zmienna + "')/items?" +
"$filter=Published eq 1" + Top + "&@Target='" + hostWebUrl + "'";
$.ajax(
{
url: url,
method: "GET",
headers: {
Accept: "application/json;odata=verbose"
},
success: function (data) {
var count = data.d.results.length;
if(count>0){
deffered1.resolve(true);
}
else {
deffered1.resolve(false);
}
},
error: function (data, errorCode, errorMessage) {
deffered1.reject(false);
}
});
return deffered1.promise();
}