【问题标题】:return a promise that resolves to a boolean true or false if a value is found如果找到值,则返回一个解析为布尔值 true 或 false 的承诺
【发布时间】:2017-10-25 06:51:53
【问题描述】:

我需要进行一个 api 调用,返回一个 id 和与之关联的值的响应。如果找到或未找到查询的 id,则 Promise 会解析并返回 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
   }

qualifiesforlowIncome 是返回 true 或 false 的布尔值。我正在使用角度,所以在这种情况下,我应该执行 $q.defer 并返回 defer.promise 吗?

这个有点不清楚

【问题讨论】:

标签: javascript angularjs promise angular-promise


【解决方案1】:

当然,您需要做的就是添加一个then case,它确定是否有任何对象与查询匹配,然后从中返回truefalse。该值将被带到下一个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));

【讨论】:

  • 是的,我得到了消耗部分。但是我将如何返回一个稍后解析为真或假的承诺。我需要使用 $q.defer 并返回一个 defer.promise 吗?
  • 这正是你需要做的,看看上面我的例子。
  • @looneytunes 做同样的事情。只需在 then 案例中返回 Promise 即可解析为 truefalse。一旦前一个承诺解决,链中的下一个then 将获得truefalse。我已编辑我的答案以包含此内容。
【解决方案2】:

您如何进行 api 调用?假设您使用 fetch。

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 端点?

【讨论】:

    【解决方案3】:

    编辑:不要这样做!原因请参见下面 Bergi 的评论。

    您需要使用 $qhasUserValue() 返回一个延迟承诺,在该方法中发出您的 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 创建一个延迟承诺,然后从函数中以 dfd.promise 的形式返回承诺。 dfd 对象将具有 resolve()reject() 方法,可用于在您调用方法时注册的 then()catch() 回调中传回自定义值。

    【讨论】:

    • 好吧,我会被诅咒的,谢谢你的链接。看来我需要更多地研究 Promises!
    猜你喜欢
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2016-03-30
    相关资源
    最近更新 更多