2015-10-19 59 views
1

我覺得這是一個非常糟糕的主意,因爲我不在任何地方發現它,但在我的本地主機上測試它似乎工作。我有一個服務:AngularJs承諾:你可以使用成功嗎?

angular 
    .module('trips.services') 
    .service('Trip', Trip); 

function Trip($http, $q) { 
    //..... 

    function create(data) { 
     var api_url = "/api/trip"; 
     return $http.post(api_url, data).success(function(data) { 
      mixpanel.track("Trip: created", {}); // track that a new event happened 
     }); 
    } 
} 

我也有一個控制器,在那裏我做這樣的事情:

Trip.create(data).success(function(data) { 
    //do something after the trip is created 
}) 

現在,你可以在這個例子中,我同時使用然後答應看到和成功服務回調。如果我在調試器中執行斷點,則首先執行服務的成功回調,然後執行控制器的then子句。對於代碼組織來說,這也很好,我在服務成功後做的常見事情是在服務中,而具體的事情在控制器中。事情是,我覺得這是非常非 - 根據任何文件或例子。沒有真正找到它,我錯誤地發現了它。它在某些情況下也可能不起作用?

我也知道其他選項,$ q庫,並可能會在服務中發生變化,但最終會產生更多的代碼。

那麼,這是一個壞主意,爲什麼?任何意見都會非常有幫助。我不想制定一個錯誤的做法。

+4

但是,您可以同時使用成功,但.success已棄用,因此不應使用,所以...請使用.then。您可以多次使用。 –

+1

Promise可以通過'.then()'連接多次,也可以從'.then()'返回一個promise鏈。直到兒童鏈已完全解決,父母將不會解決問題。在您的服務中預處理您的數據然後返回承諾沒有任何問題。它也適用於錯誤處理。 '.then()'有兩個參數,成功CB和出錯。但是,您也可以使用'.catch()'來使事情看起來更簡單。不要忘記角度建立在承諾系統之上。 – ste2425

+0

感謝和好點的捕獲,我看到它幾個地方,並會開始使用它。 – Vlad

回答

1

這不一定是一個壞主意,它只是使用承諾鏈接。

.then功能如下:

.then(function(success){}, function(error){}); 

你可以看到,.success僅僅是上述第一功能速記(因爲如果你沒有申報錯誤回調)。

看到承諾可以被傳遞,也許你有多個服務提出相同的請求,你只需要創建一個承諾,那麼你可能希望聲明來自多個領域的回調,但只有一個承諾的解決方案。

所以這是一個壞主意?沒有爲什麼?這是一段靈活的代碼,真正取決於程序員的使用。你可以申報多個thens?是。你應該把它與成功回調混合?你可以,但你可能只想堅持一種風格的一致性。但那真的取決於你想要達到的目標。

角文檔:https://docs.angularjs.org/api/ng/service/ $ HTTP
(當心被棄用,可能只是想堅持。後來)

+0

謝謝。這清除了我的一切 – Vlad

2

使用承諾因此被認爲是一個很好的做法,你已經知道了。要做到這一點,你可以簡單地用另一個then取代你success -callback:

function create(data) { 
    var api_url = "/api/trip"; 

    var promise = $http.post(api_url, data); 

    promise.then(function(data) { 
     mixpanel.track("Trip: created", {}); // track that a new event happened 
    }); 

    return promise; 
} 

上一個承諾擁有多個獨立.then() s是完全正常的工作和你所期望的。

+0

謝謝,這有很大的幫助。 – Vlad