2017-05-26 7 views
1

私は私の状況で約束をどのように処理すればよいのか少し混乱します。私はこのようにやって回避しようと私の工場で連鎖約束を扱う方法

return { 
    getCategory: function(categoryId) { 
    var ref = firebase.database().ref().child('categories').child(categoryId); 
    var category = $firebaseObject(ref); 
    return category.$loaded().then(function() { 
     return category; 
    }); 
    }, 
    getEntry: function(categoryId, entryId) { 
    var ref = firebase.database().ref().child('entries').child(categoryId).child(entryId); 
    var entry = $firebaseObject(ref); 
    return entry.$loaded().then(function() { 
     return entry; 
    }); 
    } 
} 

:ロードされた$()が約束自体を返すので

var d = $q.defer(); 
if() { 
    d.resolve(); 
} 
return d.promise; 

この

は私の工場です。私が達成したい何

var categoryId = 'abc'; 
var entryId = 'def'; 
// so here i'm getting the category 
MyFactory.getCategory(categoryId) 
.then(function(category) { 
    if(category.$value === null) 
    { 
     $scope.error = 'The category does not exist'; 
    } 
    else if(new Date() > new Date(category.expireDate)) 
    { 
     $scope.error = 'The category has expired'; 
    } 
    else { 
     $scope.category = category; 
     // if no errors 
     return MyFactory.getEntry(category.$id, entryId); 
    } 
}) 
.then(function(entry) { 
    if(entry.$value === null) 
    { 
     $scope.error = 'No such entry'; 
    } 
    else { 
     $scope.entry = entry; 
    } 
}) 
.catch(function(error) { 
    console.error(error); 
}); 

は最初のカテゴリを取得することで、その後、いくつかのエラーがあるか否か、それぞれのエントリを取得:

は、これは私のコントローラです。データはFirebaseデータベースから取得されます。これは一種の働いている

、しかし、私は次の.thenをしたいとは、このような他に巣それら一つないとき、私は約束をどのように扱うか本当にわからない:

MyFactory.getCategory().then(function(category) { 
    if(no category errors) { 
     MyFactory.getEntry().then(function() { 
      // ... 
     }); 
    } 
}); 

今のところ、カテゴリが期限切れになっているか存在しないなど、コンソールでエラーが発生しています(タイプエラーエントリは未定義です)。 私が戻ったときに私はコントローラで何かが間違っていたと思うが、私は本当に確実ではないし、あなたがすべての疑問を払拭するのを助けることができると願っている。

実際の質問は、私がこのを正しく扱い、どのように正しくを処理するのですか?おかげさまで

答えて

1

エラーが発生した場合、拒否された約束を返す必要があります。次の例で

ルック:

MyFactory 
    .getCategory(categoryId) 
    .then(function (category) { 
     if (category.$value === null) { 
      return $q.reject('The category does not exist'); 
     } 
     if (new Date() > new Date(category.expireDate)) { 
      return $q.reject('The category has expired'); 
     } 
     $scope.category = category; 
     return MyFactory.getEntry(category.$id, entryId); 
    }) 
    .then(function (entry) { 
     if (entry.$value === null) { 
      return $q.reject('No such entry'); 
     } 
     $scope.entry = entry; 
    }) 
    .catch(function (error) { 
     $scope.error = error; 
    }); 

があなたのコントローラに$qを注入することを忘れないでください。

編集

私はまた、あなたのサービスに「エラーロジック」に移動を示唆しているので、コントローラは常に.then(data => { ... })で、データまたは.catch(error => { ... })のエラー文字列を受け取ります。これはあなたのコントローラをよりきれいにするでしょう、そしてあなたが別のコントローラでこれらのサービスメソッドを使うならば、ロジックをそこに複製する必要はありません。

サービス

return { 
    getCategory: function(categoryId) { 
     var ref = firebase.database().ref().child('categories').child(categoryId); 
     var category = $firebaseObject(ref); 
     return category.$loaded().then(function() { 
      if (category.$value === null) { 
       return $q.reject('The category does not exist'); 
      } 
      if (new Date() > new Date(category.expireDate)) { 
       return $q.reject('The category has expired'); 
      } 
      return category; 
     }); 
    }, 
    getEntry: function(categoryId, entryId) { 
     var ref = firebase.database().ref().child('entries').child(categoryId).child(entryId); 
     var entry = $firebaseObject(ref); 
     return entry.$loaded().then(function() { 
      if (entry.$value === null) { 
       return $q.reject('No such entry'); 
      } 
      return entry; 
     }); 
    } 
} 

コントローラ

MyFactory 
    .getCategory(categoryId) 
    .then(function (category) { 
     $scope.category = category; 
     return MyFactory.getEntry(category.$id, entryId); 
    }) 
    .then(function (entry) { 
     $scope.entry = entry; 
    }) 
    .catch(function (error) { 
     $scope.error = error; 
    }); 
+0

おやっああ!それは私を大いに助けました。ありがとうございました。 もう一度少し混乱します。 $ q.rejectをサービスで使用しています。それは実際に拒否していると約束していますか?あなたは$ q.defer()をしないので? –

+0

私は助けることができてうれしいです! '$ q.reject()'は、あるステップで約束を作成し拒否する「ショートカット」です。正式な文書は次のとおりです - https://docs.angularjs.org/api/ng/service/$q#reject –

関連する問題