Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   SyntaxError: Unexpected token { в return (https://javascript.ru/forum/node-js-io-js/59365-syntaxerror-unexpected-token-%7B-v-return.html)

Sigizmund2012 08.11.2015 09:48

SyntaxError: Unexpected token { в return
 
Здравствуйте. Стоит задача: найти все файлы в директории и создать массив с датами последней модификации. Вот код:
var fs = require( 'fs' );
var path = __dirname;
var filesModified = [];

fs.readdir( path, function( err, files ){
	if( err ) console.log( err );
	return new Promise( resolve, reject ){
		for ( var i = 0; i < files.length ; i++ ){
			var file = path + '/' + files[i];
			fs.stat( file, function( err, stats ){
				filesModified.push( stats.mtime );
			} );
		}
		resolve( 'End' );
	}
} ).then( function( end ){
	console.log( filesModified );
	console.log( end );
} ).catch( function( err ){
	console.log( err );
} );

Возникает вышеописанная ошибка. Чего ему фигурные скобки не нравятся? Версия ноды 4.2.1

Sigizmund2012 08.11.2015 10:00

Поначалу хотел сделать через mz/fs
var fs = require( 'mz/fs' );
var path = __dirname;
var filesModified = [];

fs.readdir( path, function( err, files ){
	if( err ) console.log( err );
	for ( var i = 0; i < files.length ; i++ ){
		var file = path + '/' + files[i];
		fs.stat( file, function( err, stats ){
			filesModified.push( stats.mtime );
		} );
	}
} ).then( function(){
	console.log( filesModified );
} );

но нода ругается на метод then(). Что-то в новой ноде нихера не работает :(

Safort 08.11.2015 21:21

Sigizmund2012,
а должно? В спецификации метод readdir разве возвращает обещание? Если нет, то и не удевительно, что Нода ругается.

Sigizmund2012 09.11.2015 09:23

Цитата:

Сообщение от Safort (Сообщение 395202)
Sigizmund2012,
а должно? В спецификации метод readdir разве возвращает обещание? Если нет, то и не удевительно, что Нода ругается.

Библиотека mz/fs как раз и оборачивает методы файловой системы( и не только их ) в промисы, поэтому да, должно работать. Но не работает.

Sigizmund2012 09.11.2015 09:37

Попробовал так сделать:
var fs = require( 'fs' );
var path = __dirname;
var filesModified = [];

fs.readdir( path, function( err, files ){
	if( err ) console.log( err );
	var promise = new Promise( resolve, reject ){
		for ( var i = 0; i < files.length ; i++ ){
			var file = path + '/' + files[i];
			fs.stat( file, function( err, stats ){
				filesModified.push( stats.mtime );
			} );
		}
		resolve( 'End' );
	}
	return promise;
} ).then( function( end ){
	console.log( filesModified );
	console.log( end );
} ).catch( function( err ){
	console.log( err );
} );

но Нода всё равно на фигурные скобки ругается. Синхронно-то всё работает, но мне на промисах сделать надо.

Sigizmund2012 09.11.2015 10:54

Всё-таки получилось сделать. Как обычно, причина не в Ноде, а в прокладке между сиденьем и монитором :)
var fs = require( 'fs' );
var path = __dirname;
var filesModified = [];
var promise = new Promise( createArrayModified );
promise.then( arrayComplete ).catch( errorHandler );

function createArrayModified( resolve, reject ){

	fs.readdir( path, readFilesModified );

	function readFilesModified( err, files ) {
		var checkArrays;
		if ( err ) console.log( err );
		for ( var i = 0; i < files.length; i++ ) {
			var file = path + '/' + files[i];
			fs.stat( file, function ( err, stats ) {
				filesModified.push( stats.mtime );
			} );
		}
		checkArrays = setInterval( function(){
			if( filesModified.length === files.length ){
				resolve();
				clearInterval( checkArrays );
			}
		} ,100 );
	}
}

function arrayComplete(){
	console.log( filesModified );
}

function errorHandler( err ){
	console.log( err );
}


Часовой пояс GMT +3, время: 20:47.