2016-07-04 3 views
-1

Ich habe eine Methode, die an mehreren Stellen im Projekt aufgerufen wird. Ich habe Methode gemacht. der erste Methodenaufruf führt Ajax get aus, speichert Daten in der Klasseneigenschaft und feuert den Rückruf ab. Die zweite Aufrufmethode ruft nur Callback mit zwischengespeicherten Daten auf. Ich möchte die Fähigkeit hinzufügen, Daten synchron zu laden. Das Datum sollte von der Methode zurückgegeben werden. Ich habe einen zusätzlichen Parameter hinzugefügt, um {async: false} aufzurufen, aber ich frage mich, ob es eine bessere Lösung mit ES7-Versprechen gibt?Daten mit Callback laden. Gibt es eine bessere Lösung mit ES6 Promises?

Dies ist meine Rückruf-Lösungen.

export class loadData { 
    constructor() { 
     this.data = []; 
    } 
    getData({callback, async = true}){ 
     let syncData = this.data; 
     if(this.data.length === 0){ 
      $.ajax({ 
       beforeSend: authorizationManager.addAuthorizeHeader(), 
       url: apiUrl + '/Data/datadata', 
       dataType: 'json', 
       cache: true, 
       async: async 
      }).done((data)=>{ 
       if(async) callback(data); 
       this.data = data; 
       syncData = data; 
      }); 
     } else { 
      if(async) callback(this.data); 
     } 

     if(async === false) return syncData; 
    } 

} 
loadDataTest = new loadData(); 

Anruf async

loadDataTest.getData({ 
    callback: (data) =>{ 
     console.log(data); 
    } 
}); 

Anruf sync

let a = loadDataTest.getData({ 
    async: false 
}); 
+4

Wenn die Funktion asynchron ist, können Sie sie nicht synchron machen. Versprechen sind keine Möglichkeit, eine asynchrone Funktion, eine Synchronisierung, zu machen. – thefourtheye

Antwort

2

Promises sind fast immer die bessere Lösung. Natürlich sind sie niemals synchron, aber das ist normalerweise auch die bessere Lösung. Dies ist, wie es aussehen würde:

export class loadData { 
    constructor() { 
     this.promise = null; 
    } 
    getData() { 
     if (this.promise == null) { 
      this.promise = Promise.resolve($.ajax({ 
       beforeSend: authorizationManager.addAuthorizeHeader(), 
       url: apiUrl + '/Data/datadata', 
       dataType: 'json', 
       cache: true 
      })); 
     } 
     return this.promise; 
    } 
} 

und der Ruf:

loadDataTest.getData().then((data) => { 
    console.log(data); 
}); 

Ich möchte die Möglichkeit, fügen Sie Daten zu laden synchron

Ich glaube nicht, Du willst das wirklich. Wenn Sie nur synchrone Syntax für die asynchrone Funktionalität haben möchten, werfen Sie einen Blick auf async/await.

+0

danke, aber ES7 async/erwartet keinen Rückgabewert wie folgt aus: lassen a = loadDataTest.getData ({ async: false }) –

+0

@Whitcik: Es 'lassen a = erwarten loadDataTest.getData()' 'innerhalb einer Asynchron Funktion ". – Bergi

+0

@Whitcik: Warum glauben Sie, dass Sie die Funktion synchron machen müssen? – Bergi

Verwandte Themen