2016-09-16 89 views
-1

我有一个简单的代码,包括异步任务:回调叫当任务完成或已经完成

// 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 }; 
} 

我的要求是,新闻推送的onload需要在这两个情况下要执行:

  • 如果loadFeed的ajax已完成,请立即运行它。
  • 如果loadFeed的ajax还没有完成,请运行它。
+0

'this.loadFeed();'会抛出一个错误。但无论如何,这听起来像你正在描述一个承诺所做的。它会在完成时执行回调,如果在完成后添加另一个回调,将立即调用结果。 –

+0

谢谢,它是坏的。它应该是'this.loadFeed = function()' –

回答

0

真的没有必要使用newconstructor当你不需要新的情况下,你真正需要的是运行一个简单的Ajax功能,从缓存中获取结果,如果它没有改变。

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

的新格局,而不是回调使用承诺 看到: https://github.com/kriskowal/q

与jQuery你可以使用: https://api.jquery.com/category/deferred-object/

现在代码:

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

这是一个非常常见的反模式...'$ .ajax'已经返回一个promise,不需要创建一个新的 – charlietfl

+0

参见http:// stackoverflow .COM /问题/ 23803743 /什么,是最明确的,承诺建设,反模式和如何-DO-I-避免,它 – charlietfl