2012-08-30 47 views
1

我想要在javascript中創建一個API(在一個單一的對象內)的系統,所有這些都來自jQuery的ajax函數,但我希望能夠通過一個覆蓋「成功」的功能被觸發,像這樣:傳遞函數作爲參數在javascript中使用另一個函數

function Eidos(){ 

    this.api = function(data, success){ 
     $.ajax({ 
      type: 'POST', 
      url: '/api', 
      data: data, 
      success: function(rData){ 
       return rData; 
      } 
     }) 
    }; 

    this.refreshInfo = function(id, success){ 
      log.info('refreshed page id: '+ id); 
      return this.api({'command': 'refresh', 'pageid': id}, success); 
    } 


}; 

在這個例子中,我只是想「刷新」信息(拉在新的文本數據,或者你有什麼)。我已經有了一個服務器端頁面設置。

而且我可以調用它,就像這樣:

$('.refresh').click(function(){ 
     $("#myModal").modal('show'); 
     var id = $(this).data('ei'); 
     var api = eidos.refreshInfo(id, function(){ 
       $("#myModal").modal('hide'); 
       }); 
     return false; 
    }); 

顯然,這並不正常工作(順便說一句,該物體已經通過變種的Eidos =新的Eidos()創建的),但是,IDK如何實現它。我希望成功:功能在不同的頁面上行爲不同,所以我需要一個覆蓋,但我不知道如何使這個工作在這裏。

回答

1

您沒有在任何地方使用success回調。

this.api = function(data, success){ 
    $.ajax({ 
     type: 'POST', 
     url: '/api', 
     data: data, 
     success: success || function(rData) { 
      // some default handler to use if none is passed 
     } 
    }) 
}; 

success: success || function(rData) {允許您的成功參數是可選的;如果沒有傳遞,它將使用您指定的默認處理程序。

+0

謝謝!正是我正在尋找的!我也只是測試了一下。工程100%!我很欣賞^。^我的早期版本只是在功能(rData)中使用「成功」,但我猜它應該是像其他人所說的那樣成功()。 – antjanus

4

嘗試改變

success: function(rData){ 
    return rData; 
} 

success: success 

你目前沒有要求(即使不使用)的success說法。

1

您正在進行異步調用,您的行爲就像是同步的。您不能從異步調用返回,並期望它將數據返回到調用的位置。

this.api = function(data, success){ 
    $.ajax({ 
     type: 'POST', 
     url: '/api', 
     data: data, 
     success: function(rData){ 
      return rData; //<-- That return is not going to work 
     } 
    }) 
}; 

如果你想傳回一個回叫,那就分配它。

this.api = function(data, success){ 
    $.ajax({ 
     type: 'POST', 
     url: '/api', 
     data: data, 
     success: success 
     } 
    }) 
}; 

或稱之爲

this.api = function(data, success){ 
    var that = this; 
    $.ajax({ 
     type: 'POST', 
     url: '/api', 
     data: data, 
     success: function(rData){ 
      success(); //<-- call it or you can use apply/call 
      //success.apply(that,arguments); 
      return rData; //<-- That return is not going to work 
     } 
    }) 
}; 
2
 success: function(rData){ 
      return rData; 
     } 

的問題。您已經有一個回調函數中的參數,所以使用它:

 success: function(rData) { 
      success(rData); 
     } 

,或者縮短它,直接傳遞迴調函數到jQuery的AJAX作爲參數。

0

想到這一點的方法是,當jQuery ajax函數觸發它時,會將rData傳遞到您的函數中。 rData只會在jQuery內部的一個關閉範圍內的某個地方返回,因爲你沒有任何控制權,所以對它做某些事情的地方就在這個成功函數中。

或者你可能預示的東西與其他事件外:

//... 
    success:function(rData){ 
     $(someOtherObject).trigger({type:'rDataDelievered', successData:rData}); 
    } 
} 

someOtherObject.bind('rDataDelivered', function(e){ doSomething(e.successData); }); 

這不是一個頻繁使用的功能,但,是的,你可以定義在運行一個新的事件,並觸發它你想用jQuery的任何東西。如果你沒有通過rData對象,trigger('rDataDelivered')就足以獲得一個簡單的信號。但是這裏有一些冗餘。如果沒有什麼能夠阻止你,那麼最好在適當的時候用ajax事件建立成功函數。

相關問題