web-dev-qa-db-ja.com

値が見つかった場合にブール値のtrueまたはfalseに解決されるpromiseを返します

IDとそれに関連付けられた値の応答を返すAPI呼び出しを行う必要があります。次に、promiseは解決され、照会されたIDが見つかった場合、または見つからなかった場合にtrueまたはfalseを返します。

どうすればこれを達成できますか? promiseの使用は初めてです。約束は紛らわしいようです

これがAPIを使用する際のエンドポイントであり、UserServiceはIDと給与の配列を返します。 IDが存在し、給与がクエリと一致するかどうかを確認する必要があります。その後、promiseをtrueまたはfalseに解決する必要があります。

これがIDと収入の対象です

      [{
            "id": 1,
            "name": "Primary",
            "sal": [{
                    "id": "1",
                    "sal": "10"
                }, {
                    "id": "2",
                    "sal": "20"
                }]
            },{
            "id": 2,
            "name": "Secondary",
            "sal": [{
                    "id": "1",
                    "sal": "100"
                }, {
                    "id": "2",
                    "sal": "200"
                }
            ]
        }];


  UserService.hasUserValue(id, income).then(function(qualifiesforlowIncome){
     var isLowIncome = qualifiesforlowIncome
   }

qualizesforlowIncomeは、trueまたはfalseを返すブール値です。私はangularを使用しているので、この場合、$ q.deferを実行してdefer.promiseを返す必要がありますか?

これについては少し不明確

5
looneytunes

確かに、あなたがする必要があるのは、オブジェクトのいずれかがクエリに一致するかどうかを決定するthenケースを追加し、そこからtrueまたはfalseを返すことです。その値は、次のthenケースに持ち込まれます。

この例では、 some メソッドを使用して、配列内のオブジェクトのいずれかが条件に一致するかどうかを確認しています。

Promise.resolve([
    {
      id: 1
    },
    {
      id: 2
    },
    {
      id: 3
    }
  ])
  .then(results => 
    results.some(r => r.id === 2)
  )
  .then(foundResult => console.log(foundResult));

またはES5で書き直しました:

Promise.resolve([
    {
      id: 1
    },
    {
      id: 2
    },
    {
      id: 3
    }
  ])
  .then(function(results) { 
    return results.some(r => r.id === 2);
  })
  .then(function(foundResult) {
    console.log(foundResult);
  });

これは、後で解決するPromiseを返してもまったく同じように機能します。

Promise.resolve([
    {
      id: 1
    },
    {
      id: 2
    },
    {
      id: 3
    }
  ])
  .then(results => 
    // Return a promise, delay sending back the result
    new Promise((resolve, reject) => {
      setTimeout(() =>
        resolve(results.some(r => r.id === 2)),
        500
      );
    })
  )
  .then(foundResult => console.log(foundResult));
4
Mike Cluck

どのようにAPI呼び出しを行いますか?フェッチを使用するとします。

const UserService = {
    getUsersWithIncome(income) {
        return fetch("your.api/users?income="+income).then(resp => resp.json());
    }
    hasUserValue(id, income) {
        return UserService.getUsersWithIncome(income).then(users => { 
            return users.some(u => u.id == id);
        });
    }
};

ちなみに、ここでは論理が逆になっているようです。それで、低所得のユーザーをリストしてから特定のIDを探すエンドポイントがありますか?特定のIDを持つユーザーの収入が少ないかどうかを直接通知するRESTエンドポイントがないのはなぜですか?

0
Tamas Hegedus

編集:これをしないでください!理由については、以下のベルギのコメントを参照してください。

_$q_を使用してhasUserValue()から遅延プロミスを返し、そのメソッド内でAPIリクエストを作成し、APIリクエストが終了してクランチする機会があった後にプロミスを解決することをお勧めします数字:

_hasUserValue(id, income) {
  var dfd = $q.defer();

  SomeService.getSalaries().then(function(resp) {
    // Do some logic here with the response
    var qualifiesforlowIncome = someFuncThatDeterminesEligibility(resp);
    // This is the value that will be returned for `qualifiesforlowIncome` in your then() callback
    dfd.resolve(qualifiesforlowIncome);
  });

  return dfd.promise;
}
_

これは基本的に擬似コードです。重要なのは、AngularJSの_$q_を使用して遅延Promiseを作成し、関数から_dfd.promise_としてPromiseを返すことです。 dfdオブジェクトにはresolve()およびreject()メソッドとthen()メソッドがあり、これらを使用してcatch()または_ [function()]でカスタム値を返すことができます。 _メソッドを呼び出すときに登録するコールバック。

0
IAmKale