Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺,然后和信息_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 承诺,然后和信息

Javascript 承诺,然后和信息,javascript,node.js,promise,Javascript,Node.js,Promise,我一直在努力实现承诺,.then(),我成功地创建了两个承诺,它们运行了,我认为,尽管排序仍然错误,第一个承诺会得到一个更新的电子表格,下一个承诺会向该电子表格添加内容并发送带有该表格数据的邮件,无论我做什么,我都无法获得正确的排序。“完成获取最新驱动器表…”消息始终在邮件规则运行后打印,但应在之前打印。getNewSheet承诺应该运行,然后sendMails承诺应该运行。为什么getNewSheet()没有运行,然后是.sendMails 请帮助我理解为什么这个没有运行,我对承诺做了什么错误

我一直在努力实现承诺,.then(),我成功地创建了两个承诺,它们运行了,我认为,尽管排序仍然错误,第一个承诺会得到一个更新的电子表格,下一个承诺会向该电子表格添加内容并发送带有该表格数据的邮件,无论我做什么,我都无法获得正确的排序。“完成获取最新驱动器表…”消息始终在邮件规则运行后打印,但应在之前打印。getNewSheet承诺应该运行,然后sendMails承诺应该运行。为什么getNewSheet()没有运行,然后是.sendMails

请帮助我理解为什么这个没有运行,我对承诺做了什么错误,另外为什么承诺的消息方法没有返回它们的值?我想是因为承诺没有按照正确的顺序解决

请注意,我仍在学习并使用环境变量作为一些变量,我已经编辑了我可以编辑的内容,虽然有点长,但我很好奇,在每个承诺中包含代码/函数之前,我是否需要做一些进一步的工作

编辑:编辑代码以使其更准确

            let getNewSheet = function () {
                return new Promise(function (resolve, reject) {
                    const fs = require("fs");
                    const readline = require("readline");
                    const {
                        google
                    } = require("googleapis");

                    const SCOPES = "https://www.googleapis.com/auth/drive";
                    const TOKEN_PATH = "token.json";

                    fs.readFile("credentials.json", (err, content) => {
                        if (err) return console.log("Error loading client secret file:", err);
                        authorize(JSON.parse(content), getLatestListFromDrive);
                    });
                    function authorize(credentials, callback) {
                        const {
                            client_secret, client_id, redirect_uris } = credentials.installed;
                        const oAuth2Client = new google.auth.OAuth2(
                            client_id, client_secret, redirect_uris[0]
                        );

                        fs.readFile(TOKEN_PATH, (err, token) => {
                            if (err) return getAccessToken(oAuth2Client, callback);
                            oAuth2Client.setCredentials(JSON.parse(token));
                            callback(oAuth2Client);
                        });
                    }
                    function getAccessToken(oAuth2Client, callback) {
                        const authUrl = oAuth2Client.generateAuthUrl({
                            access_type: "offline",
                            scope: SCOPES
                        });
                        console.log("Authorize this app by visiting this url:", authUrl);
                        const rl = readline.createInterface({
                            input: process.stdin,
                            output: process.stdout
                        });
                        rl.question("Enter the code from that page here: ", code => {
                            rl.close();
                            oAuth2Client.getToken(code, (err, token) => {
                                if (err) return console.error("Error retrieving access token", err);
                                oAuth2Client.setCredentials(token);
                                fs.writeFile(TOKEN_PATH, JSON.stringify(token), err => {
                                    if (err) console.error(err);
                                    console.log("Token stored to", TOKEN_PATH);
                                });
                                callback(oAuth2Client);
                            });
                        });
                    }

                    function getLatestListFromDrive(auth) {
                        const drive = google.drive({
                            version: "v3",
                            auth
                        });
                        var fileId = process.env.NODE_DRIVE_FILE_ID;
                        var dest = fs.createWriteStream("" + appDir + "\\tmp\\feedbacklist.xlsx");

                        drive.files.export({
                            fileId: fileId,
                            mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                        }, {
                                responseType: "stream"
                            },
                            function (err, res) {
                                res.data
                                    .on("end", () => {
                                    })
                                    .on("error", err => {
                                        console.log("Error", err);
                                    })
                                    .pipe(dest);
                            }
                        );
                    }
                    resolve();
                });

            };

            var path = require("path");
            var appDir = path.dirname(require.main.filename);
            let sendMails = function () {
                return new Promise(function (resolve, reject) {
                    const XLSX = require("xlsx");
                    const workbook = XLSX.readFile("" + appDir + "\\tmp\\feedbacklist.xlsx", {
                        type: "binary",
                        cellDates: true,
                        dateNF: "yyyy-mm-dd;@"
                    });
                    const SheetNameList = workbook.SheetNames;
                    var rows = XLSX.utils.sheet_to_json(workbook.Sheets[SheetNameList[0]], {
                        raw: false
                    });
                    var raw = workbook.Sheets[SheetNameList[0]];
                    var today = new Date();
                    today = today.toISOString().slice(0, 10);
                    var dateYesterday = new Date();
                    dateYesterday.setDate(dateYesterday.getDate() - 1);
                    dateYesterday = dateYesterday.toISOString().slice(0, 10);
                    var dayYesterday = new Date();
                    var days = [
                        "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
                    ];
                    dayYesterday.setDate(dayYesterday.getDate() - 1);
                    dayYesterday = days[dayYesterday.getDay()];
                    var dateTomorrow = new Date();
                    dateTomorrow.setDate(dateTomorrow.getDate() + 1);
                    dateTomorrow = dateTomorrow.toISOString().slice(0, 10);
                    var dayTomorrow = new Date();
                    var futureDays = [
                        "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
                    ];
                    dayTomorrow.setDate(dayTomorrow.getDate() + 1);
                    dayTomorrow = futureDays[dayTomorrow.getDay()];

                    var filteredRows = rows.filter(eachRow);
                    function eachRow(eachRow) {
                        return eachRow["tourDate"] === dateYesterday;
                    }
                    if (filteredRows != 0) {
                        for (x = 0; x < filteredRows.length; x++) {

                            console.log(filteredRows[x].emailAddress);
                            console.log(filteredRows[x].fName);
                            console.log(filteredRows[x].tourDate);
                            console.log(filteredRows[x].feedbacksent);
                            var nodemailer = require("nodemailer");

                            var transporter = nodemailer.createTransport({
                                host: process.env.NODEMAILER_SERVICE,
                                secure: false,
                                auth: {
                                    user: process.env.NODEMAILER_USER,
                                    pass: process.env.NODEMAILER_PASS
                                }
                            });
                            var mailOptions = {
                                from: process.env.NODEMAILER_FROM,
                                to: "" + filteredRows[x].emailAddress + "",
                                subject: "Hi",
                                html: "Hi ",
                                text: "Hi "
                            };
                            console.log("I've sent a feedback request to " + filteredRows[x].emailAddress);
                            transporter.sendMail(mailOptions, function (error, info) {
                                //check for console errors
                                if (error) {
                                    console.log(error);
                                } else {
                                    console.log(
                                        "Feedback request sent to " +
                                        filteredRows[x].emailAddress
                                    );

                                };

                            })
                        }
                    } else {
                        console.log("No rows/records to process for yesterday..");
                    }
                    resolve();

                });
            };

            getNewSheet(console.log("drive fetched")).then(function (result) {
                console.log("mails sent");
                return sendMails(result);

            }).then(function () {
                console.log("promises finished");
            });
让getNewSheet=函数(){
返回新承诺(功能(解决、拒绝){
常数fs=要求(“fs”);
const readline=require(“readline”);
常数{
谷歌
}=要求(“googleapis”);
常量范围=”https://www.googleapis.com/auth/drive";
const TOKEN_PATH=“TOKEN.json”;
fs.readFile(“credentials.json”,(err,content)=>{
if(err)返回console.log(“加载客户端机密文件时出错:”,err);
authorize(JSON.parse(content),getLatestListFromDrive);
});
函数授权(凭据、回调){
常数{
client\u secret、client\u id、redirect\u uris}=credentials.installed;
const oAuth2Client=new google.auth.OAuth2(
客户端id、客户端机密、重定向URI[0]
);
fs.readFile(令牌路径,(错误,令牌)=>{
if(err)返回getAccessToken(oAuth2Client,回调);
oAuth2Client.setCredentials(JSON.parse(token));
回调(oAuth2Client);
});
}
函数getAccessToken(oAuth2Client,回调){
const authUrl=oAuth2Client.generateAuthUrl({
访问类型:“脱机”,
范围:范围
});
log(“通过访问此url授权此应用:”,authUrl);
const rl=readline.createInterface({
输入:process.stdin,
输出:process.stdout
});
rl.question(“在此处输入该页面的代码:”,代码=>{
rl.close();
oAuth2Client.getToken(代码,(错误,标记)=>{
if(err)返回console.error(“检索访问令牌时出错”,err);
oAuth2Client.setCredentials(令牌);
writeFile(TOKEN_PATH,JSON.stringify(TOKEN),err=>{
if(err)控制台错误(err);
日志(“令牌存储到”,令牌路径);
});
回调(oAuth2Client);
});
});
}
函数getLatestListFromDrive(auth){
const drive=google.drive({
版本:“v3”,
认证
});
var fileId=process.env.NODE\u DRIVE\u FILE\u ID;
var dest=fs.createWriteStream(“+appDir+”\\tmp\\feedbacklist.xlsx”);
drive.files.export({
fileId:fileId,
mimeType:“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”
}, {
响应类型:“流”
},
函数(err、res){
资源数据
.on(“结束”,()=>{
})
.on(“错误”,err=>{
日志(“错误”,err);
})
.管道(目的地);
}
);
}
解决();
});
};
var路径=要求(“路径”);
var appDir=path.dirname(require.main.filename);
设sendMails=function(){
返回新承诺(功能(解决、拒绝){
常量XLSX=要求(“XLSX”);
常量工作簿=XLSX.readFile(“+appDir+”\\tmp\\feedbacklist.XLSX”{
键入:“二进制”,
cellDates:是的,
dateNF:“yyyy-mm-dd;@”
});
const SheetNameList=workbook.SheetNames;
var rows=XLSX.utils.sheet_to_json(workbook.Sheets[SheetNameList[0]]{
生:假
});
var raw=workbook.Sheets[SheetNameList[0]];
var today=新日期();
return new Promise(function (resolve, reject) {
  let result
  fs.someAsyncOperation(function (data) {
    result = data
  })
  resolve(result) // the promise will resolve immediately with undefined value
}

return new Promise(function (resolve, reject) {
  fs.someAsyncOperation(function (result) {
    resolve(result) // the promise will resolve after async operation is completed
  })
}
should be done after email
email sent!
email sent!
should be done after email