Показать сообщение отдельно
  #1 (permalink)  
Старый 02.09.2020, 11:17
Новичок на форуме
Отправить личное сообщение для Alesei Посмотреть профиль Найти все сообщения от Alesei
 
Регистрация: 02.09.2020
Сообщений: 1

Проблема с использованием промисов
Всем здравствуйте.
Возникла проблема с работой цикла в функции, из-за асинхронного его выполнения.
Изначально я его сделал на XMLHttpReuqest, где принудительно указывал запрет на асинхронность параметром false, но потребовалось переделать на fetch, и тут у меня возникли проблемы, как я понимаю мне надо все переделать на промисы .then, но что-то я не догоняю как правильно это сделать.
Не пинайте сильно, это мой первый код не только на js, а в принципе.
https://learn.javascript.ru/promise-basics <- данную статью читал, и не вкурил совсем.


const express = require('express');
const fetch = require('node-fetch');
const app = express();
const port = 3000;
const excel = require('exceljs');
const workbook = new excel.Workbook();

//Заносим в опцию токен для Синтека
const options = {
    headers: {
        ZakupayToken: '***'
    }
};

//Обновляем справочники
let payers;
let acceptor;
fetch('https://***/api/v1/refbooks/offerPayers?', options)
    .then(response => response.json())
    .then(data => payers = data.payers);
fetch('https://***/api/v1/refbooks/offerAcceptors?', options)
    .then(response => response.json())
    .then(data => acceptor = data.acceptors)
    .then(() => acceptor.splice(0,0,{
        "firstName":"",
        "id":"",
        "lastName":"Любой"        
    }));

//ВЭБ форма нашего микросервиса
app.use(express.static('public'));

app.get('/', (req, res) => {
    const content = `<html><head></head><body>
	<h1>Эн-Системс Синтека БСПБ</h1>
	<h2>Сформировать импорт-файл</h2>
	<form action="/save" method="get">
		Период с: <input type="date" name="dateFrom" />
		по: <input type="date" name="dateTo" /><br><br>
		Плательщик: <select name="payerId">${payers.map((p) => `<option value=${p.id}>${p.shortName}</option>`)}</select><br><br>
		Акцептор: <select name="acceptor">${acceptor.map((p) => `<option value=${p.id}>${p.lastName} ${p.firstName}</option>`)}</select><br><br>
		<input type="submit" value="Сформировать">
    </form>
  </body></html>`;
  res.send(content);
});

app.get('/save', (req, res) => {
	const params = req.query;
	const resp = cynteka(params);
	res.send(resp);
});

app.listen(port, () => {
  console.log(`Example app listening at http://10.1.1.211:${port}`)
});

//Функция формирования импорт-файла для БСПБ
function cynteka({dateFrom, dateTo, payerId, acceptor}) {
	const params = [
		dateFrom ? 'creationDateFrom=' + dateFrom : '',
		dateTo ? 'creationDateTo=' + dateTo : '',
		payerId ? 'payer=' + payerId : '',
		acceptor ? 'acceptor=' + acceptor : '',
		'pageSize=1'
    ].join('&');

    let respBuffer = ''; //Буфер для вывода результата на экран

    let url = 'https://***/api/v1/offers?' + params;

    let count;

    let filename = 'public/import-bspb.xlsx';

    //Создаем пустой эксель и заполняем шапку
	let xlsx = [
		"№ пп", 
		"Несрочный платеж", 
		"Сумма", 
		"ИНН получателя", 
		"Наименование получателя", 
		"Р/сч получателя", 
		"БИК банка получателя", 
		"Код вида дохода", 
		"Назначение платежа",
	];
	workbook.addWorksheet('Лист 1').addRow(xlsx);

    //Запрашиваем количество счетов
    fetch(url, options)
        .then(response => response.json())
        .then(data => count = data.totalCount);

    respBuffer += 'Обработаных счетов: ' + count + '<br>';
    
    //Цикл обработки счетов    
    while (count){
        let offers;
        let nds;

        fetch(url + '&page=' + count, options)
            .then(response => response.json())
            .then(data => offers = data.offers[0]);
    
        if (offers.vat != 0){
            let vat = offers.vat * 100 +"%";
            let vatAmount = (((offers.totalAmount / (1 + offers.vat) ) - offers.totalAmount) * -1).toFixed(2);
            nds = `В том числе НДС ${vat} ${vatAmount} руб.`;
        }else{
            nds = "НДС не облагается";
        };

        try {
		    xlsx = [
			    offers.id, 
			    "нет", 
			    (offers.totalAmount).toFixed(2), 
			    offers.supplier.inn, 
			    offers.supplier.shortName, 
			    offers.destinationAccount.currentAccount, 
			    offers.destinationAccount.bik,
			    ,
			    `Счет ${offers.producerOfferNumber} от ${moment(offers.producerOfferDate).format("DD-MM-YYYY")} ${nds}`,
		    ];
		    workbook.getWorksheet('Лист 1').addRow(xlsx); //Добавлем обработанную строку в эксель
		} catch (err) {
            respBuffer += `Счет №${offers.id}: Ошибка обработки <input type="button" class="button13" value="Открыть в Синтека" onclick="window.open('https://***/core/offers/${offers.id}/report')">` + '<br>';
		};
		
        count--;
        
    };

    workbook.xlsx.writeFile(filename); //Сохраняем эксель файл

	respBuffer += `Импорт-файл для БСПБ готов:` + '<br>';
	respBuffer += `<button onclick="document.location='/import-bspb.xlsx'">Скачать</button> <button onclick="document.location='/'">Назад</button>`;

    return respBuffer;
};
Ответить с цитированием