# ifelseAsync > If a predicate function returns a truthy value, return `x`; otherwise, return `y`.
## Usage ```javascript var ifelseAsync = require( '@stdlib/utils/async/if-else' ); ``` #### ifelseAsync( predicate, x, y, done ) If a `predicate` function returns a truthy value, returns `x`; otherwise, returns `y`. ```javascript var randu = require( '@stdlib/random/base/randu' ); function predicate( clbk ) { setTimeout( onTimeout, 0 ); function onTimeout() { clbk( null, randu() > 0.5 ); } } function done( error, result ) { if ( error ) { throw error; } console.log( result ); } ifelseAsync( predicate, 1.0, -1.0, done ); ``` The `predicate` function is provided a single argument: - `clbk`: callback to invoke upon `predicate` function completion The callback accepts two arguments: - `error`: error object - `bool`: condition used to determine whether to return `x` or `y` The `done` callback is invoked upon function completion and is provided at most two arguments: - `error`: error object - `result`: either `x` or `y`
## Notes - Execution is **not** guaranteed to be asynchronous. To guarantee asynchrony, wrap the `done` callback in a function which either executes at the end of the current stack (e.g., `nextTick`) or during a subsequent turn of the event loop (e.g., `setImmediate`, `setTimeout`).
## Examples ```javascript var randu = require( '@stdlib/random/base/randu' ); var ifelseAsync = require( '@stdlib/utils/async/if-else' ); var i; function next() { ifelseAsync( predicate, 'BOOP', 'beep', done ); } function predicate( clbk ) { setTimeout( onTimeout, 0 ); function onTimeout() { clbk( null, randu() > 0.9 ); } } function done( error, result ) { if ( error ) { throw error; } i += 1; console.log( result ); if ( i < 100 ) { return next(); } } i = 0; next(); ```