Отложенные операторы внутри класса jQuery / TypeScript /JavaScript

#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 , то нет причин переключаться на a class now. Сохраняйте свои простые функции.

4. Что делает запятая и выражение функции после .then() вызова в последнем операторе? Это похоже на синтаксическую ошибку.