Краткий ответ: ваш метод foo()
возвращается немедленно, а вызов $ajax()
выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.
В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo()
и сохранить результаты в члене этого объекта после завершения асинхронного вызова.
function foo(result) {
$.ajax({
url: '...',
success: function(response) {
result.response = response; // Store the async result
}
});
}
var result = { response: null }; // Object to hold the async result
foo(result); // Returns before the async completes
Обратите внимание, что вызов foo()
] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response
.
Хорошее сравнение компрессоров JavaScript вы должны посмотреть.
Мне недавно нужно было выполнить ту же задачу. В то время как компрессоры, перечисленные в , JavaScript CompressorRater выполняют отличную работу, и этот инструмент очень полезен, компрессоры не играли хорошо с некоторым кодом jQuery, который я использую (проверки $ .getScript и jQuery.fn). Даже компрессор Google Closure Compressor подавлен в одних и тех же строках. Несмотря на то, что я мог в конце концов сгладить изломы, ему было очень много ловкости, чтобы делать постоянно.
Тот, который, наконец, работал без проблем, был UglifyJS (спасибо @ Aries51 ), и сжатие было лишь немного меньше всех остальных. И, похоже, Google имеет HTTP API. Packer также хорош и имеет реализацию языка в Perl, PHP и .NET.
Вы можете использовать один из многих доступных javascript-минификаторов.
Google только что предоставил компилятор javascript, который может минимизировать ваш код, исключить ветви мертвого кода и больше оптимизаций.
С уважением K
Существует также бесплатный Minifier от Microsoft на codeplex. Microsoft Ajax Minifier 1.1: http://ajaxmin.codeplex.com/
С этим легко работать и делает хорошую работу.
Gal
g3]В настоящее время существует два способа минимизации вашего кода:
http://yui.github.io/yuicompressor/
Многие такие инструменты доступны для узла и npm, а также - это хорошо чтобы автоматизировать mnification Javascript с Grunt.
Я написал крошечный скрипт, который вызывает API для получения вашего скрипта, проверьте его:
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use Fcntl;
my %api = ( css => 'https://cssminifier.com/raw', js => 'https://javascript-minifier.com/raw' );
my $DEBUG = 0;
my @files = @ARGV;
unless ( scalar(@files) ) {
die("Filename(s) not specified");
}
my $ua = LWP::UserAgent->new;
foreach my $file (@files) {
unless ( -f $file ) {
warn "Ooops!! $file not found...skipping";
next;
}
my ($extn) = $file =~ /\.([a-z]+)/;
unless ( defined($extn) && exists( $api{$extn} ) ) {
warn "type not supported...$file...skipping...";
next;
}
warn "Extn: $extn, API: " . $api{$extn};
my $data;
sysopen( my $fh, $file, O_RDONLY );
sysread( $fh, $data, -s $file );
close($fh);
my $output_filename;
if ( $file =~ /^([^\/]+)\.([a-z]+)$/ ) {
$output_filename = "$1.min.$2";
}
my $resp = $ua->post( $api{$extn}, { input => $data } );
if ( $resp->is_success ) {
my $resp_data = $resp->content;
print $resp_data if ($DEBUG);
print "\nOutput: $output_filename";
sysopen( my $fh, $output_filename, O_CREAT | O_WRONLY | O_TRUNC );
if ( my $sz_wr = syswrite( $fh, $resp_data ) ) {
print "\nOuput written $sz_wr bytes\n";
my $sz_org = -s $file;
printf( "Size reduction %.02f%%\n\n", ( ( $sz_org - $sz_wr ) / $sz_org ) * 100 );
}
close($fh);
}
else {
warn: "Error: $file : " . $resp->status_line;
}
}
Использование:
./minifier.pl a.js c.css b.js cc.css t.js j.js [..]
Наряду с минимизацией вы можете также закодировать base64. Это делает ваш файл намного более сжатым. Я уверен, что вы видели js-файлы, которые обернуты внутри функции eval () с переданными параметрами (p, a, c, k, e, r). Я прочитал его в этой статье Как минимизировать файл Javascript?