Significado da Função Javascript 2

Olá amigos,

Tenho a seguinte função que não consigo entender muito bem…

Todos os comandos que começam com api são chamadas apis desenvolvidos pela empresa que trabalho, mas a questão é o contexto da função e comandos que não possuo conhecimento ainda.

Muito Obrigado.

function getAssetData(pApprovalRecord) {
return $.Deferred(function(pDefer) {
api_async.asset.list([‘cloudflow.part’, ‘equal to’, pApprovalRecord.references[0]], undefined, function(result) {
if ($.isArray(result.results) && (result.results.length > 0)) {
pDefer.resolve(result.results[0]);
}
else {
pDefer.reject(‘error’);
}
}, pDefer.reject)
});
}

		var usermail = api.auth.get_current_user().email;

		var approved = api.approval.list(["iterations.assessment", "equal to", "accept", "and", "iterations.participants.email_address", "equal to", usermail, "and", "iterations.participants.assessment", "equal to", "accept"]).results;
		var rejected = api.approval.list(["iterations.assessment", "equal to", "reject", "and", "iterations.participants.email_address", "equal to", usermail, "and", "iterations.participants.assessment", "equal to", "reject"]).results;
		var waiting = api.approval.list(["iterations.assessment", "equal to", "pending", "and", "iterations.participants.email_address", "equal to", usermail, "and", "iterations.participants.assessment", "equal to", "pending"]).results;

		for (i = 0; i < waiting.length; i++) {
			var row = $('<tr>');
			$('#waitinglist').append(row);
			getAssetData(waiting[i]).then((function(pApprovalRecord, pRow) {
				return function(pAssetData) {
					var theColor = "orange",
						theState = "WAITING",
						theAssigned = usermail,
						theStart = new Date(pApprovalRecord.iterations[0].start_time);

					pRow.append(
						'<td>' 
							+ '<a href="/portal.cgi?proofscope&url=' + pApprovalRecord.references[0] + '&perm=111">' 
								+ '<img align="center" width="100" src="' + pAssetData.thumb + '">'
							+ '</a>'
						+ '</td>'
						+ '<td>' + pAssetData.file_name + '</td>'
						+ '<td style="text-align: center;">' + theStart.toLocaleString() + '</td>'
						+ '<td style="color:' + theColor + '; text-align: center;">' + theState + '</td>'
						+ '<td style="text-align: center;">' + theAssigned + '</td>');
				};
			}(waiting[i], row)));
		}