Упростить Promise Javascript

78
08 декабря 2021, 16:10

Есть код, он рабочий. Я новичок в промисах, можно ли как-то упростить его? Знаю, что сделал неправильно, второй промис можно как-то вынести отдельно. Подскажите, как правильно сделать. Спасибо.

const cheerio = require("cheerio"); 
 
var App = require('./app.class'); 
var App = new App(); 
 
 
App.clientsList().then(async function (res) { 
    var $ = cheerio.load(res.content); 
 
    for(var k = 0; k<=$(".clientTable tr").length; k++) { 
 
        var el = $(".clientTable tr").eq(k); 
        var data = { 
            fields: { 
                "UF_CRM_1575291282905": $(el).find("td").eq(1).text(), 
                "NAME": $(el).find("td").eq(6).text(), 
                "SECOND_NAME": "Не указана", 
                "UF_CRM_1575292481": $(el).find("td").eq(3).text().trim(), 
                "PHONE": [{"VALUE": $(el).find("td").eq(8).text().trim(), "VALUE_TYPE": "WORK"}], 
                "EMAIL": [{"VALUE": $(el).find("td").eq(4).find("a").text(), "VALUE_TYPE": "WORK"}] 
            } 
        }; 
        if (data.fields["UF_CRM_1575291282905"] == "" || data.fields["NAME"] == "") continue; 
 
 
 
 
 
        var data_purchase = { 
            page: "orders", 
            mas_status: { 
                "40226": "40226" 
            }, 
            allorders: "", 
            filter_contractor: data.fields["UF_CRM_1575291282905"], 
            relativeDateRange: "thisYear", 
            get_report: "1" 
        }; 
 
        await App.getPurchase(data_purchase).then(purchase => { 
 
            var $ = cheerio.load(purchase); 
            var allPrice = 0.00; 
            $(".ordProcc tbody tr").each(function (i, e) { 
                var price = parseFloat($(e).find("td").eq(7).text().trim().replace(",", ".").replace(" ", "")); 
                if (!isNaN(price)) { 
                    allPrice += price; 
                } 
            }); 
            data.fields["UF_CRM_1575295352"] = allPrice.toFixed(2); 
            console.log(data.fields["UF_CRM_1575291282905"]+":"+data.fields["UF_CRM_1575295352"]); 
 
            // App.bxClientAdd(data); 
        }); 
 
 
 
 
 
 
 
 
    } 
 
});

Answer 1

Механики Promise и async - await хоть и разные, но используются для одной и той же цели - упростить работу с асинхронным кодом и избежать callback-hell'а.

В Вашем случае вы пытаетесь использовать один механизм внутри другого. Анонимную функцию из App.clientsList().then() не нужно указывать с ключевым словом async (как соответственно и параметры внутри неё с await), потому что Promise сам по себе уже подразумевает обработку асинхронных данных.

Функция обработчика данных внутри then() выполнится, когда Promise разрешится положительно,то есть данные успешно придут и все дальнейшие манипуляции с ними вы будете выполнять внутри функции обработчика, но только когда Promise будет в состоянии resolve. Метод then() также возвращает Promise, данные из которого при его resolve можно обработать в уже его then().

Вы можете поместить второй Promise, App.getPurchase(data_purchase).then(), в функцию обработчика без await, а можете вернуть из этой функции необходимые данные и обработать их другой функцией в следующем then(), создав таким образом цепочку из then():

 Promise.then(функция обработчика данных, 
    полученных, когда Promise станет resolve)
    .then(функция обработчика данных из предыдущего then())
    .catch(err => console.log(err))

catch() на случай, если один из Promise в цепочке не выполнится и перейдёт в состояние reject.

READ ALSO
Перемножение ячеек таблицы JS

Перемножение ячеек таблицы JS

Как сделать так, что бы при перемножении ячеек таблицы 1 и таблицы 2, в таблицу 3 результат перемножения каждой ячейки выводился в ту же ячейку...

70
Как редактировать сообщение с помощью его id? Discord JS

Как редактировать сообщение с помощью его id? Discord JS

Почему у меня не редактирует сообщение?

168
DatePicker ReactNative

DatePicker ReactNative

Как мне оставить только месяц например, чтобы не отображались дни и годformat = "dddd" пробовал, ошибку выдает

146
Почему функция возвращает undefined?

Почему функция возвращает undefined?

У меня есть массив, каждое значение которого обозначает сторону света:

113