This might be a bad question, because it's possible the issue is to something else in my project, but I was hoping that changing the header from an AJAX call may be an issue someone is familiar with. The below PHP function executes fine when called synchronously, but does not download anything and returns a 200 error when I call it from AJAX.
public function download_csv() {
$csv = 'hello, header';
header('Content-Disposition: attachment; filename="format.csv"');
header('Content-Type: text/plain');
header('Content-Length: ' . strlen($csv));
header('Connection: close');
echo $csv;
}