2017-08-16 44 views
3

我想讓我的節點JS代碼一步一步的工作,而不是異步使用Promise然後。節點JS承諾然後鏈接不順序

我首先刪除所有電子表格,然後生成它們,然後壓縮它們,然後加密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 
+0

你可以立即調用resolve()而不用等待異步操作。這不是承諾如何工作 - 你必須從異步回調中調用它。 – Bergi

+0

您應該自行確定每個異步函數(如'unlink','query','save'等),以便您可以編寫它們,並在可以同時等待的那些循環中創建一組promise。 – Bergi

回答

2

你正在回覆承諾,然後以錯誤的方式解決。此外,您並未等待所有刪除操作都會發生。看一下這個。

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數組解決。所以你可以撥打deleteSpreadsheets().then....