Function

Module: rsvp
import { filter } from 'rsvp';
promises
Array
filterFn
Function
- function to be called on each resolved value to filter the final results.
label
String
optional string describing the promise. Useful for tooling.
returns
Promise

RSVP.filter is similar to JavaScript's native filter method. filterFn is eagerly called meaning that as soon as any promise resolves its value will be passed to filterFn. RSVP.filter returns a promise that will become fulfilled with the result of running filterFn on the values the promises become fulfilled with.

For example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 let promise1 = RSVP.resolve(1);
 let promise2 = RSVP.resolve(2);
 let promise3 = RSVP.resolve(3);

 let promises = [promise1, promise2, promise3];

 let filterFn = function(item){
   return item > 1;
 };

 RSVP.filter(promises, filterFn).then(function(result){
   // result is [ 2, 3 ]
 });

If any of the promises given to RSVP.filter are rejected, the first promise that is rejected will be given as an argument to the returned promise's rejection handler. For example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 let promise1 = RSVP.resolve(1);
 let promise2 = RSVP.reject(new Error('2'));
 let promise3 = RSVP.reject(new Error('3'));
 let promises = [ promise1, promise2, promise3 ];

 let filterFn = function(item){
   return item > 1;
 };

 RSVP.filter(promises, filterFn).then(function(array){
   // Code here never runs because there are rejected promises!
 }, function(reason) {
   // reason.message === '2'
 });

RSVP.filter will also wait for any promises returned from filterFn. For instance, you may want to fetch a list of users then return a subset of those users based on some asynchronous operation:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 let alice = { name: 'alice' };
 let bob   = { name: 'bob' };
 let users = [ alice, bob ];

 let promises = users.map(function(user){
   return RSVP.resolve(user);
 });

 let filterFn = function(user){
   // Here, Alice has permissions to create a blog post, but Bob does not.
   return getPrivilegesForUser(user).then(function(privs){
     return privs.can_create_blog_post === true;
   });
 };
 RSVP.filter(promises, filterFn).then(function(users){
   // true, because the server told us only Alice can create a blog post.
   users.length === 1;
   // false, because Alice is the only user present in `users`
   users[0] === bob;
 });