Есть код, он рабочий. Я новичок в промисах, можно ли как-то упростить его? Знаю, что сделал неправильно, второй промис можно как-то вынести отдельно. Подскажите, как правильно сделать. Спасибо.
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);
});
}
});
Механики 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
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как сделать так, что бы при перемножении ячеек таблицы 1 и таблицы 2, в таблицу 3 результат перемножения каждой ячейки выводился в ту же ячейку...
Почему у меня не редактирует сообщение?
Как мне оставить только месяц например, чтобы не отображались дни и годformat = "dddd" пробовал, ошибку выдает
У меня есть массив, каждое значение которого обозначает сторону света: