簡體   English   中英

節點JS承諾然后鏈接不按順序

[英]Node JS Promises then chaining not in order

我試圖讓我的Node JS代碼一步一步地工作,而不是異步使用Promise。

我首先刪除所有電子表格,然后生成它們,然后壓縮它們,然后加密zip,然后通過電子郵件發送zip,然后刪除電子表格。

 //Schedules the job at a specific time var start = schedule.scheduleJob({ hour: 19, minute: 26, dayOfWeek: 3 }, function() { sendIt(); }); //Starts the Promise Chain function sendIt() { return deleteSpreadsheets().then(generateSpeadsheets).then(zipSpreadsheets).then(encrypt).then(sendEmail).then(deleteSpreadsheets); } //Deletes the current Spreadsheets in the folder function deleteSpreadsheets() { var promise = new Promise(function(resolve, reject) { console.log('Deleting Spreadsheets'); var locationSpread = ['Location.xlsx']; locationSpread.forEach(function(filename) { if (fs.existsSync("./Spreadsheets/" + filename)) { fs.unlink("./Spreadsheets/" + filename, (err) => { if (err) { console.log('Spreadsheet ' + filename + ' not found'); } else { console.log('Spreadsheet ' + filename + ' successfully deleted'); } }); } }); resolve(); }); return promise; } //Generates the new Spreadsheets function generateSpeadsheets() { var promise = new Promise(function(resolve, reject) { console.log('Generating Spreadsheets'); var locationSpread = ['Location.xlsx']; locationSpread.forEach(function(filename) { var query = connection.query('SELECT * from ' + filename.slice(0, -5), function(err, rows) { var workbook = excelbuilder.createWorkbook('./Spreadsheets/', filename); if (workbook == null) { console.log('workbook null') }; var sheet = workbook.createSheet(filename.slice(0, -5), 3, rows.length + 1); if (sheet == null) { console.log('sheet null') }; sheet.set(1, 1, 'First Name'); sheet.set(2, 1, 'Last Name'); sheet.set(3, 1, 'Company'); for (var j = 2, z = 0; z < rows.length; j++, z++) { sheet.set(1, j, rows[z].firstName); sheet.set(2, j, rows[z].lastName); sheet.set(3, j, rows[z].company); } workbook.save(function(err) { console.log('workbook saved ' + (err ? 'failed' : 'ok')); }); }); }); resolve(); }); return promise; } //Generates a Zip file with all the Spreadsheets function zipSpreadsheets() { var promise = new Promise(function(resolve, reject) { console.log('Zipping Spreadsheets'); var zipFolder = require('zip-folder'); zipFolder('./Spreadsheets/', './Spreadsheets.zip', function(err) { if (err) { console.log('Failed to zip folders', err); reject(); } else { console.log('Successfully zipped folder'); } }); resolve(); }); return promise; } //Encrypts the Spreadsheet function encrypt() { var promise = new Promise(function(resolve, reject) { console.log('Encrypting'); spawn = require('child_process').spawn; zip = spawn('zip', ['-P', 'something', 'Encrypted.zip', './Spreadsheets.zip']); zip.on('exit', function(code) { console.log('Finished encrypting'); resolve(); }); }); return promise; } //Sends the Encryped Zip as an attached in an email function sendEmail() { var promise = new Promise(function(resolve, reject) { console.log("MAIL SCHEDULE RUNNING"); var transporter = nodemailer.createTransport({ service: 'Gmail', auth: { user: 'email', // Your email id pass: 'password' } }); var content = 'something'; var mailOptions = { from: 'email', // sender address to: 'email', // list of receivers subject: 'Title', // Subject line text: content, attachments: [{ // file on disk as an attachment filename: 'Encrypted.zip', path: './Encrypted.zip' // stream this file }] }; transporter.sendMail(mailOptions, function(error, info) { if (error) { console.log(error); reject(); } else { console.log('Message sent: ' + info.response); resolve(); }; }); }); return promise; } 

這似乎沒有像日志中看到的那樣按計划運行:

Deleting Spreadsheets  
Generating Spreadsheets 
Zipping Spreadsheets   
Encrypting            
**Spreadsheet Location.xlsx successfully deleted**
**Finished encrypting**    
MAIL SCHEDULE RUNNING
**Successfully zipped folder**
**workbook saved ok**
Message sent: -----------------------------------------------
Deleting Spreadsheets
Spreadsheet Location.xlsx successfully deleted

這是它應該是什么:

Deleting Spreadsheets  
**Spreadsheet Location.xlsx successfully deleted**
Generating Spreadsheets 
**workbook saved ok**
Zipping Spreadsheets   
**Successfully zipped folder**
Encrypting            
**Finished encrypting**    
MAIL SCHEDULE RUNNING
Message sent: -----------------------------------------------
Deleting Spreadsheets
Spreadsheet Location.xlsx successfully deleted

你正在回復承諾,然后以錯誤的方式解決。 此外,您不會等待所有刪除發生。 看一下這個。

function deleteSingle(filename) {
  return new Promise((resolve, reject) => {
    if (fs.existsSync("./Spreadsheets/" + filename)) {
      fs.unlink("./Spreadsheets/" + filename, (err) => {
        //handle errors or whatever
        return resolve();  
      });
    } else {
      //handle if file doesnt exist
      return resolve();
    }
  })
}

//Deletes the current Spreadsheets in the folder
function deleteSpreadsheets() {
  //we are maping each value inside locationSpread and passing it to the deleteSingle function which returns a promise
  return Promise.all(locationSpread.map(deleteSingle))
}

所以,我拆分了你的代碼。 deleteSingle函數返回一個在文件被刪除后解析的promise(如果文件沒有被刪除或者不存在,它也會解析,你可以修改它來做你想做的任何事情)。

然后, deleteSpreadsheets函數返回一個promise,一旦promise內部的數組解析,它將被解析。 所以你可以調用deleteSpreadsheets().then....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM