亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么承諾的回調是反模式的?

為什么承諾的回調是反模式的?

滄海一幻覺 2019-07-11 12:40:23
為什么承諾的回調是反模式的?我在StackOverflow上看到了答案,人們建議為AngularJS服務提供回調函數。app.controller('tokenCtrl', function($scope, tokenService) {     tokenService.getTokens(function callbackFn(tokens) {         $scope.tokens = tokens;     });});app.factory('tokenService', function($http) {     var getTokens = function(callbackFn) {         $http.get('/api/tokens').then (function onFulfilled(response) {             callbackFn(response.data);         });     };     return {         getTokens: getTokens    };});在我看來,這是一種反模式。這個$http服務返回承諾.then方法執行回調函數感覺就像不健康的控制反轉。如何再因素這樣的代碼,以及如何解釋為什么最初的方法是不是個好主意?
查看完整描述

3 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

你應該把它改成

var getTokens = function() {
      return $http.get('/api/tokens');
    };

然后,在其他模塊中使用

yourModule.getTokens()
  .then(function(response) {
    // handle it
  });

至于為什么它是反模式,首先,它不允許您進一步鏈接成功/失敗處理程序方法。其次,它處理從調用模塊到被調用模塊的響應的控制(這在這里可能不是非常重要,但它仍然強制執行相同的控制反轉)。最后,您將承諾的概念添加到代碼庫中,這對于一些隊友來說可能不是那么容易理解,但隨后使用承諾作為回調,所以這真的沒有意義。


查看完整回答
反對 回復 2019-07-11
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

代碼可以按以下方式重新分解:

app.controller('tokenCtrl', function($scope, tokenService) {
    tokenService.getTokens.then ( callbackFn(tokens) {
        $scope.tokens = tokens;
    });});app.factory('tokenService', function($http) {
    var getTokens = function() {
        //return promise
        return $http.get('/api/tokens').then (function onFulfilled(response) {
                //return tokens
                return response.data;
            }
        );
    };

    return {
        getTokens: getTokens    };});

通過讓服務返回一個承諾,并使用.then方法實現了相同的功能,其優點如下:

  • 承諾可以被拯救并用于鏈子.

  • 可以保存承諾并使用它來避免重復相同的承諾。$http打電話。

  • 錯誤信息被保留,并且可以使用.catch方法。

  • 這個承諾可以轉發給其他客戶。


查看完整回答
反對 回復 2019-07-11
?
手掌心

TA貢獻1942條經驗 獲得超3個贊

這個返回對象的服務沒有多大意義.它需要返回一個承諾,這樣無論什么用途,它都可以知道什么時候數據準備好了。

查看完整回答
反對 回復 2019-07-11
  • 3 回答
  • 0 關注
  • 586 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號