Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как асинхронно вызвать метод? (https://javascript.ru/forum/misc/64037-kak-asinkhronno-vyzvat-metod.html)

PMaster 16.07.2016 14:16

Как асинхронно вызвать метод?
 
Пишу плагин для jQuery. В настройках плагина есть объект, содержащий метод render:

columns: {
            id: {
                name: '',
                isSearch: false,
                isSortable: true,
                render: function (content) {
                    return '<td>' + content[id] + '</td>';
                }
            },


В метод render передаю объект content. Код выполняется асинхронно.
Получаю ошибку:

ReferenceError: id is not defined


Код, из которого вызывается метод:

var request = ajax.index(settings);
request.done(function(result) {
            for (var column in result) {
                html += settings.columns[column].render(content);
            }
        }


Сам объект content:

Object { id=1, type="main", parameter="sitename", ...}


Мне нужно получить доступ к свойствам объекта content в методе render. Подскажите, пожалуйста, как правильно это сделать?

PMaster 16.07.2016 14:48

Есть такой вариант на костылях:

render: function (content) {
                    if (typeof content !== 'undefined') if (typeof content.id !== 'undefined') {
                        return '<td>' + content.id + '</td>';
                    }
                }


Так работает и всё же хотелось бы более грамотное решение. Что бы не писать if (typeof content !== 'undefined') в каждом такой функции.

destus 16.07.2016 15:14

return '<td>' + content['id'] + '</td>';

PMaster 16.07.2016 15:27

Цитата:

Сообщение от destus (Сообщение 422228)
return '<td>' + content['id'] + '</td>';


Так тоже не работает.


destus 16.07.2016 15:31

PMaster,
потому что здесь
for (var column in result) {
                html += settings.columns[column].render(content);
            }

content нигде не определяется.

PMaster 16.07.2016 19:13

Цитата:

Сообщение от destus (Сообщение 422232)
PMaster,
потому что здесь
for (var column in result) {
                html += settings.columns[column].render(content);
            }

content нигде не определяется.

Определяется. Я просто из контекста вырвал кусок кода. Если там console.log(content) сделать, то все Ok.

Erolast 16.07.2016 19:37

Цитата:

Сообщение от destus (Сообщение 422228)
return '<td>' + content['id'] + '</td>';

Какая разница?

Цитата:

Определяется. Я просто из контекста вырвал кусок кода. Если там console.log(content) сделать, то все Ok.
Значит, объявляется, но не определяется.
В консоли написано undefined - значит, undefined. Браузеру виднее.

destus 16.07.2016 20:04

Цитата:

Какая разница?
let obj = {id: 123},
	s;
	
	try{
		s = 'keeeek' + obj[id];
		alert(s);
	}
	catch(e){
		alert(e);
	}

	try{
		s = 'blablabla' + obj['id'];
		alert(s);
	}
	catch(e){
		alert(e);
	}

Erolast 16.07.2016 20:34

А. Я с этим вариантом сравнивал:
Цитата:

return '<td>' + content.id + '</td>';

PMaster 16.07.2016 22:48

Цитата:

Сообщение от Erolast (Сообщение 422262)
Значит, объявляется, но не определяется.
В консоли написано undefined - значит, undefined. Браузеру виднее.


Могу сказать, почему в браузере - undefined. Выше писал, что код асинхронно работает. При инициализации настроек jQuery плагина метод render почему-то запускается, при этом никаких данных никто ему не отправлял.

Видимо это происходит при объединении настроек:
settings = $.extend(true, {}, defaults, options);


На данный момент я добавил еще один параметр async. При асинхронном вызове явно задаю параметр в true:

render: function (async, content) {
    if (async == true) return '<td>' + content.id + '</td>';
 }


Такой код работает, правда с костылем.


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