返回一个解析为布尔值为true的promise或者如果找到值则返回false

时间:2017-05-24 19:06:26

标签: javascript angularjs promise angular-promise

我需要进行一次api调用,它会返回id的响应以及与之关联的值。如果找到或未找到id,则promise将解析并返回true或false。

我怎样才能做到这一点?使用承诺的新手。承诺似乎令人困惑

这是使用API​​的终点,UserService返回一个id和工资数组。我需要检查id是否存在且薪水是否与查询匹配,然后promise需要解析为true或false。

这是id' s和收入

的对象
ITestResult

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

有点不清楚

3 个答案:

答案 0 :(得分:3)

当然,您需要做的就是添加then个案例,确定是否有任何对象与查询匹配,然后从中返回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));




答案 1 :(得分:0)

你如何打电话给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的用户是否收入低?

答案 2 :(得分:0)

编辑:不要这样做!请参阅下面的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()回调中传回自定义值方法