2016-09-16 5 views
-1

ich einen einfachen Code, der asynchrone Aufgaben beinhaltet:Rückruf aufgerufen, wenn eine Aufgabe abzuschließen, oder bereits fertig

// The NewsFeed Class 

function NewsFeed() { 

    this.loadFeed = function() { 
     $.ajax({ 
      url: "http://www.example.com", 
      success: function() { 
       // doSomething here, and call onload. 
      } 
     }); 
    } 

    // Need to implement onload here somehow 
    this.onload = ?; 

    this.loadFeed(); 
    return this; 

} 
NewsFeed.constructor = NewsFeed; 



// In main JS file 
var newsFeed = new NewsFeed(); 
$(function() { 
    // do something 
    newsFeed.onload = function() { // do something when news feed is loaded }; 
} 

Meine Forderung ist, dass onload von Newsfeed benötigt in beiden Fällen ausgeführt werden:

  • Wenn der Ajax von loadFeed beendet ist, führen Sie ihn sofort aus.
  • Wenn der Ajax von loadFeed noch nicht fertig ist, renne danach.
+0

'this.loadFeed();' wird einen Fehler auslösen. aber irgendwie klingt es so, als würdest du beschreiben, was ein Versprechen verspricht. Es wird einen Rückruf ausführen, wenn Sie fertig sind, und wenn Sie einen weiteren Rückruf hinzufügen, nachdem es fertig ist, wird es sofort mit dem Ergebnis aufgerufen. –

+0

Danke, es war schlecht. Es sollte sein 'this.loadFeed = function()' –

Antwort

0

gibt es wirklich keine Notwendigkeit new oder constructor zu verwenden, wenn Sie keine neue Instanzen benötigen, alles, was Sie wirklich brauchen, ist eine einfache Ajax-Funktion auszuführen, die das Ergebnis aus dem Cache erhält, wenn er sich nicht geändert hat. statt Rückruf

function newsFeed() { 
    return $.ajax({ 
     url : "http://www.example.com", 
     cache : true // let the browser handle caching for you 
    }); 
} 


// In main JS file 
$(function() { 
    newsFeed().then(function() { 
     // do something when news feed is loaded 
    }); 
}); 
0

Das neue Muster wird Promises siehe Verwendung: https://github.com/kriskowal/q

Mit jquery können Sie: https://api.jquery.com/category/deferred-object/

jetzt der Code:

function NewsFeed() { 
 

 
    function loadFeed() { 
 
     var deferred = $.Deferred(); 
 
     $.ajax({ 
 
      url: "http://www.example.com", 
 
      success: function(data) { 
 
       deferred.resolve(data); 
 
      }, 
 
      error: function(data) { 
 
       deferred.reject(data); 
 
      } 
 
     }); 
 
     return deferred.promise(); 
 
    } 
 

 
    this.loadFeed = loadFeed; 
 
    return this; 
 

 
} 
 
NewsFeed.constructor = NewsFeed; 
 

 

 

 
// In main JS file 
 
var newsFeed = new NewsFeed(); 
 
newsFeed.loadFeed().done(function(data){ 
 
    //data loaded successfully 
 
}) 
 
.fail(function(data){ 
 
    //ajax request failed 
 
}) 
 
.always(function(){ 
 
    //finally: 
 
});

+0

Dies ist ein sehr häufiges Anti-Pattern ... '$ .ajax' gibt bereits ein Versprechen, es gibt keine Notwendigkeit, ein neues zu erstellen – charlietfl

+0

siehe http: // stackoverflow com/questions/23803743/was-ist-das-explizite-versprechen-konstruktion-antipattern-und-wie-ich-vermeide-es – charlietfl

Verwandte Themen