#javascript #jquery #typescript #class #async-await
#javascript #jquery #typescript #класс #асинхронное ожидание
Вопрос:
Я был отключен от серьезной разработки JavaScript в течение нескольких лет. Сейчас я снова погружаюсь в работу, но уже около дня зависаю над, казалось бы, тривиальной, простой вещью.
Это разрабатывается в TypeScript с использованием ES2019, перенесенного на JavaScript, поэтому доступны современные навороты, если это поможет.
Я хочу преобразовать некоторые функции, которые я написал, в класс, который запрашивает, обрабатывает, а затем в конечном итоге сохраняет данные внутри класса из базы данных. Это извлечение одного из потоков функций.
Эта базовая (неклассовая) версия работает…
var setSetData = $.Deferred(); // activates when an array of ID's is converted from the url params string into actual DB ids of elements in those sets
// takes in a string of URL params, and in PHP returns index IDs to objects that belong to a set of objects
//names is an array of names derived from a URL param variable like set1,set2,set3
function getIDsBySet(names:Array<string> | false){
var dbRecord = $.ajax({
url: "./src/php/getIdsBySet.php",
type: 'POST',
dataType: "json",
data: {
sets:names,
},
success: function(data:JSON){
return setSetData.resolve(data);
}
});
}
function addToPriorityLoader(ids:Array<number>){
// processing code here, which does involve further DB query, but this should suffice as an example to get me back on track
}
//When we have a set specified in the URL send these DB ids to the priority loading lane
$.when(setSetData).then(addToPriorityLoader),
function(failed:object){
console.log("error in processing set list", failed);
};
Как, черт возьми, вы помещаете это в класс, который TypeScript может скомпилировать, а затем запустить? Я серьезно потратил около дня на то, чтобы пробовать разные методы. Все они терпят неудачу из-за ввода в строгом режиме (этот оператор ожидания не вызывает никаких проблем, когда строгий режим вводится в мой компилятор VS code), или они не компилируются, они теряют область видимости по пути, или они компилируются нормально, но тогда в браузере нет конца ошибкам в консоли, когдазапущено.
Комментарии:
1. Просто поместите каждую функцию в метод,
$.Deferred
как поле, а$.when
в другую функцию. Убедитесь, что вы используете одно и то же имя для имени отложенного поля везде (в общем коде у вас естьnodesSetData
иsetSetData
). Тем не менее, вы можете захотеть посмотреть, что происходит с Promises и Fetch API, вместо того, чтобы продолжать работу с jQuery.2. «итак, доступны современные навороты» — тогда сначала избавьтесь от jQuery и
Promise
вместо этого используйте s (включаяasync
/await
)3. Если у вас был
function
s раньше и вы не использовалиnew
, то нет причин переключаться на aclass
now. Сохраняйте свои простые функции.4. Что делает запятая и выражение функции после
.then()
вызова в последнем операторе? Это похоже на синтаксическую ошибку.