Дождитесь окончания загрузки метода, прежде чем запускать следующий .then - node.js - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь попрактиковаться в создании узла, создав небольшое приложение, которое позволяет пользователю загружать файл.

Я сохранил файл на S3, сохранил URL в БД mLab и хочу загрузитьфайл в приложение, чтобы я мог использовать URL-адрес в качестве href на стороне клиента.В данный момент он работает, но загружает пустой файл.Я думаю, это связано с тем, что он запускает следующую then() перед загрузкой файла.

Это код, который у меня сейчас есть:

(async err => {
    const charge = await stripe.charges
      // create stripe charge
      .create({
       ...
      })
      // when the payment is successful, 
      // download the file locally to a 'dist' folder
      // so we can use it on the success page
      .then(() => {
        download(url_to_file, "dist").then(() => {
          console.log("done!");
        });
      })
      // then render the success page
      .then(
        res.render("success", {
          fileUrl: ...
        })
      )

Так на клиентеЯ могу (используя ejs) сделать что-то вроде:

<a href="<%= /dist/fileUrl %>">Download</a>

Я очень новичок в обещаниях и не уверен, как дождаться полного завершения метода загрузки, прежде чем запускать следующий, затем ирендеринг страницы успеха.

В данный момент метод запускается, затем отображается страница успеха, а затем файл появляется в приложении.Это позволяет загружать файл, но файл пуст.

Кто-нибудь может указать мне правильное направление / объяснить, как ждать завершения загрузки перед запуском следующего метода .then()?Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 04 марта 2019

Если я не ошибаюсь, просто return обещание от download.

Без return

Promise.resolve().then(()=> {
  new Promise(resolve => {
    setTimeout(() => {
      console.log('done 1');
      resolve();
    }, 1000);
  });
}).then(() => {
  console.log('done 2');
});

С return

Promise.resolve().then(()=> {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log('done 1');
      resolve();
    }, 1000);
  });
}).then(() => {
  console.log('done 2');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...