Funkcja zwracająca wartość z asynchronicznego zapytania

0

Cześć
Mam taki problem mam funkcję i nie mogę sobie poradzić z tym aby robiła prawidłowo return po czasie wykonania operacji która jest wewnątrz innej funkcji wykonywanej asynchronicznie.
Może mój bełkot nie jest jasny więc to o co mi chodzi wygląda tak i to nie działa

//funkcja przed zapisem danych
function PreSaveAction() {
	console.log('PreSaveAction');
	var resultat=null;
       $.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
		return resultat;
	});	
}
0

Musisz wykorzystać callback lub promise.

0

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ś.

0
Patryk27 napisał(a):

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();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1