如何在nodejs中进行同步调用

时间:2015-08-04 14:24:47

标签: mysql node.js promise synchronous

我正在尝试将excel文件数据从文件解析到mysql db但是我会为许多文件执行但是由于nodejs的异步属性在完成第一个文件的任务之前它会中断第二个文件所以有没有办法制作这个功能同步。

我的nodejs代码:

while (typeof issue.fields.attachment[r] != "undefined") {
    if (typeof issue.fields.attachment[r].content != "undefined") {
        var url = issue.fields.attachment[r].content;
        console.log('url :' + url);
        request({
                method: "GET",
                "rejectUnauthorized": false,
                "url": url,
                "headers": {
                    "Content-Type": "application/json",
                    "Authorization": "Basic" +
                }
            },
            function(err, data, body) {
                //console.log(data.body);
                console.log('file downloading');
            }).pipe(fs.createWriteStream('file.xlsx'));
        console.log('file downloaded');
        parseXlsx('file.xlsx', function(err, data) {});
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用async的while方法轻松地执行while调用的内容。您将条件包装在一个匿名函数中,并将其作为第一个参数传递,将您的while内容传递给另一个匿名函数,并将其作为第二个参数传递。然后,当你每次完成你的工作时,你会调用一个回调,这就是它知道循环的方式。

var async = require('async');
async.whilst(function(){return typeof issue.fields.attachment[r] !== "undefined"},function(callback){
    if(typeof issue.fields.attachment[r].content != "undefined")
    {
        var url = issue.fields.attachment[r].content ;
        console.log('url :'+url);
        var wstream = fs.createWriteStream('file.xlsx');
        request({
            method: "GET", 
            "rejectUnauthorized": false, 
            "url": url,
            "headers" :{
                "Content-Type": "application/json",
                "Authorization": "Basic"+ 
            }
        },function(err,data,body){
            //console.log(data.body);
            console.log('file downloading'); 
        }).pipe(wstream);
        wstream.on('finish',function(){
            parseXlsx('file.xlsx', function(err, data){
                return callback();
            });
        });
    }
}

您需要进行一些错误处理。如果你用err调用callback(),它将停止循环,所以如果你想让它继续,尽管有错误,你只需要调用callback();

注意:我还修改了一些写码流代码。

答案 1 :(得分:1)

您可以为希望串行执行的每个任务创建Promise。 然后它只是一个简单的链接,承诺执行串行任务。