函数内的函数要完全执行第一个函数

时间:2014-11-03 11:30:54

标签: javascript node.js

我遇到了问题。我有多个回调函数。

循环中函数内的函数

我想首先完全执行第一个函数。然后我想进一步。

Currenlty没有功能正常工作:

function recurring_end() {
var diffbot = new Diffbot('ddddd'); 
var sql= "SELECT `bookmarks`.`id`,`bookmarks`.`bookmark_url` as url FROM bookmarks LIMIT 0, 10";

connection.query(sql, function(err,bookmarks) {
    console.log(JSON.parse(JSON.stringify(bookmarks)));
     for(var i = 0; i< bookmarks.length; i++){
        (function(i) {
                    bookmark_id = bookmarks[i].id;
                    bookmark_url = bookmarks[i].url;

                    parseArticle(i,bookmark_id,bookmark_url,function(err,result){

                         bookamrk_title= result.bookmark_title;
                         bookmark_body= result.body;
                         bookmark_file_name= result.file_name;
                         preview_image = result.preview_image;
                         local_image_name =  result.local_image_name;
                         mainPreviewImage = result.mainPreviewImage;
                         viewImage=result.viewImage;
                        var mediaExist =result.mediaExist;

                        if(mediaExist == 1) {
                            console.log("Entered in Media Exist");
                                download(preview_image, "images/" + local_image_name, function() { 
                                    console.log("Entered in download");
                                    fs.exists("images/" + local_image_name, function(exists) {
                                        console.log("Before Sending " +mainPreviewImage);
                                        console.log("Before Sending Local " +local_image_name);
                                    ImageMagic(local_image_name,mainPreviewImage,223,147,function(err,result) {


                                            if(result != 0){
                                                    mainPreviewImage= result;
                                            console.log("Image Magic Done" +mainPreviewImage);

                                                    AmazonUpload(mainPreviewImage,function(err,result) {
                                                        console.log("Amazon error "+err);
                                                        if(result != 0){
                                                            mainPreviewImage  = result;
                                                            console.log("First Image Uploading is Sucessfully");

                                                            /* Now Lets Pass View Image FROM Graphic Magic */
                                                            ImageMagic(mainPreviewImage,viewImage,152,100,function(err,result) {
                                                                if(result != 0){
                                                                    viewImage= result;
                                                                    /* Upload New View File to Amazon */
                                                                        AmazonUpload(viewImage,function(err,result) {

                                                                            if(result != 0){

                                                                                viewImage = result;
                                                                                console.log("Second Image Upload to Amazon");
                                                                                /*Finally here we need to write update logic here check it out */
                                                                                console.log("Serious id is "+i);
                                                                                console.log("Book Mark id " +bookmark_id);
                                                                                console.log("bookamrk_title" +bookamrk_title);
                                                                                console.log("preview_image"+mainPreviewImage);
                                                                                console.log("viewImage"+viewImage);
                                                                                console.log("End " +ddd);






                                                                            }else {
                                                                                    /* need to write  update Query here */
                                                                                    var viewImage="thumbnail_default_bookmark1.png";
                                                                            }


                                                                        });

                                                                }else{
                                                                    /* need to write  update Query here */
                                                                    var viewImage="thumbnail_default_bookmark1.png";
                                                                }



                                                            });




                                                        }else {
                                                            /* need to writeUpdate Query Here */
                                                                var mainPreviewImage= 'default_bookmark.png';
                                                                var viewImage="thumbnail_default_bookmark1.png";
                                                        }


                                                    });


                                            }else{
                                                /* need to write Update Query here */
                                                                var mainPreviewImage= 'default_bookmark.png';
                                                                var viewImage="thumbnail_default_bookmark1.png";
                                                }

                                });

                                });
                            });/* download function closed */
                    }
                });

         })(i);

     }
     console.log("Every Thing is done ");
});
}


function AmazonUpload(uploadImage,callback) {
    knox.putFile('images/'+uploadImage,'BookmarkPreviewImages/'+uploadImage, {"Content-Type": "image/jpeg",'x-amz-acl': 'public-read'}, function (err, result) {
            if(!err){
                if(result.statusCode==200){
                    callback(err,uploadImage);
                }else{
                    callback(err,0);
                }

            }else{
                callback(err,0);
            }
    });

}

function download(uri, filename, callback) {
    request.head(uri, function(err, res, body) {
        //request(uri).pipe(fs.createWriteStream(filename),{end:true}).on('close', callback);
     var r = request(uri);
        r.pause()
        r.on('response', function (resp) {
           if(resp.statusCode === 200){
               r.pipe(fs.createWriteStream(filename),{end:true}).on('close', callback); //pipe to where you want it to go
               r.resume()
           }
        });

    });




};
function ImageMagic(local_image_name,display_image,width,height,callback){
    console.log("local_image_name is"+local_image_name);

    gm('images/'+local_image_name).resize(width, height, '^').gravity('Center').crop(width, height).write('images/'+display_image, function (err) {  

        if(!err){
            console.log("Sucessfully Image converted is "+display_image);
            console.log("Sucessfully image which is converted "+ local_image_name);

            callback(null,display_image);

        }else{
            console.log("Graphic Magic Error "+err);
            callback(err,0);
        }
    });

}
function parseArticle(i,bookmark_id,bookmark_url,callback) {
          diffbot.article({uri: bookmark_url}, function(err, response) {
            var callBackString= {};
            console.log("Diffbot Parsing URL with id " +bookmark_id+"and loop id is"+i);
                    var bookmark_title = response.title;
                    var body             = response.html;
                    var timestamp           = new Date().getTime().toString();
                    var file_name           = common_function.generateRandomString() + timestamp + '.txt';
                    var timestamp0 = new Date().getTime().toString();
                    var local_image_name = common_function.generateRandomString() + timestamp0 + i + '.jpg';
                    var preview_image = response.media[0]['link'];
                    if(response.media[0].primary=='true'){  
                            mainPreviewImage = "thumb_" + local_image_name;
                            viewImage = "thumbnail_" + local_image_name;
                            mediaExist=1;
                    }else{
                            mainPreviewImage="default_bookmark.png";
                            viewImage="thumbnail_default_bookmark1.png";
                            mediaExist=0;
                    }

                        callBackString .bookmark_title=bookmark_title;
                        callBackString.body = body;
                        callBackString.file_name = file_name;
                        callBackString.preview_image = preview_image;
                        callBackString.local_image_name =  local_image_name;
                        callBackString.mainPreviewImage = mainPreviewImage;
                        callBackString.viewImage=viewImage;
                        callBackString.mediaExist =mediaExist;
                        callback(null,callBackString);


            });

};

我理解代码太长了。我想得到一个想法,我想先完全执行i=0,然后我想继续前进。

我们如何在Nodejs中做任何想法。任何帮助都将得到满足 感谢

2 个答案:

答案 0 :(得分:2)

尝试用这样的递归代码替换循环..

function recurring_end() {
var diffbot = new Diffbot('ddddd'); 
var sql= "SELECT `bookmarks`.`id`,`bookmarks`.`bookmark_url` as url FROM bookmarks LIMIT 0, 10";

connection.query(sql, function(err,bookmarks) {
    console.log(JSON.parse(JSON.stringify(bookmarks)));

    var i = 0;
    var callbackForParseArticle = function(err,result){

        bookamrk_title= result.bookmark_title;
        bookmark_body= result.body;
        bookmark_file_name= result.file_name;
        preview_image = result.preview_image;
        local_image_name =  result.local_image_name;
        mainPreviewImage = result.mainPreviewImage;
        viewImage=result.viewImage;
        var mediaExist =result.mediaExist;

        if(mediaExist == 1) {
            console.log("Entered in Media Exist");
                download(preview_image, "images/" + local_image_name, function() { 
                    console.log("Entered in download");
                    fs.exists("images/" + local_image_name, function(exists) {
                        console.log("Before Sending " +mainPreviewImage);
                        console.log("Before Sending Local " +local_image_name);
                    ImageMagic(local_image_name,mainPreviewImage,223,147,function(err,result) {


                            if(result != 0){
                                    mainPreviewImage= result;
                            console.log("Image Magic Done" +mainPreviewImage);

                                    AmazonUpload(mainPreviewImage,function(err,result) {
                                        console.log("Amazon error "+err);
                                        if(result != 0){
                                            mainPreviewImage  = result;
                                            console.log("First Image Uploading is Sucessfully");

                                            /* Now Lets Pass View Image FROM Graphic Magic */
                                            ImageMagic(mainPreviewImage,viewImage,152,100,function(err,result) {
                                                if(result != 0){
                                                    viewImage= result;
                                                    /* Upload New View File to Amazon */
                                                        AmazonUpload(viewImage,function(err,result) {

                                                            if(result != 0){

                                                                viewImage = result;
                                                                console.log("Second Image Upload to Amazon");
                                                                /*Finally here we need to write update logic here check it out */
                                                                console.log("Serious id is "+i);
                                                                console.log("Book Mark id " +bookmark_id);
                                                                console.log("bookamrk_title" +bookamrk_title);
                                                                console.log("preview_image"+mainPreviewImage);
                                                                console.log("viewImage"+viewImage);
                                                                console.log("End " +ddd);






                                                            }else {
                                                                    /* need to write  update Query here */
                                                                    var viewImage="thumbnail_default_bookmark1.png";
                                                            }

                                                            //additional lines to the end of the function
                                                            i++;    
                                                            if (i<bookmarks.length){
                                                                bookmark_id = bookmarks[i].id;
                                                                bookmark_url = bookmarks[i].url;
                                                                parseArticle(i,bookmark_id,bookmark_url,callbackForParseArticle);
                                                            } else {

                                                                console.log("Every Thing is done ");
                                                            }


                                                        });

                                                }else{
                                                    /* need to write  update Query here */
                                                    var viewImage="thumbnail_default_bookmark1.png";
                                                }



                                            });




                                        }else {
                                            /* need to writeUpdate Query Here */
                                                var mainPreviewImage= 'default_bookmark.png';
                                                var viewImage="thumbnail_default_bookmark1.png";
                                        }


                                    });


                            }else{
                                /* need to write Update Query here */
                                                var mainPreviewImage= 'default_bookmark.png';
                                                var viewImage="thumbnail_default_bookmark1.png";
                                }

                });

                });
            });/* download function closed */
        }
    };

    if (bookmarks.length > 0){
        parseArticle(i,bookmarks[i].id,bookmarks[i].url,callbackForParseArticle); 
    }
});
}


function AmazonUpload(uploadImage,callback) {
    knox.putFile('images/'+uploadImage,'BookmarkPreviewImages/'+uploadImage, {"Content-Type": "image/jpeg",'x-amz-acl': 'public-read'}, function (err, result) {
            if(!err){
                if(result.statusCode==200){
                    callback(err,uploadImage);
                }else{
                    callback(err,0);
                }

            }else{
                callback(err,0);
            }
    });

}

function download(uri, filename, callback) {
    request.head(uri, function(err, res, body) {
        //request(uri).pipe(fs.createWriteStream(filename),{end:true}).on('close', callback);
     var r = request(uri);
        r.pause()
        r.on('response', function (resp) {
           if(resp.statusCode === 200){
               r.pipe(fs.createWriteStream(filename),{end:true}).on('close', callback); //pipe to where you want it to go
               r.resume()
           }
        });

    });




};
function ImageMagic(local_image_name,display_image,width,height,callback){
    console.log("local_image_name is"+local_image_name);

    gm('images/'+local_image_name).resize(width, height, '^').gravity('Center').crop(width, height).write('images/'+display_image, function (err) {  

        if(!err){
            console.log("Sucessfully Image converted is "+display_image);
            console.log("Sucessfully image which is converted "+ local_image_name);

            callback(null,display_image);

        }else{
            console.log("Graphic Magic Error "+err);
            callback(err,0);
        }
    });

}
function parseArticle(i,bookmark_id,bookmark_url,callback) {
          diffbot.article({uri: bookmark_url}, function(err, response) {
            var callBackString= {};
            console.log("Diffbot Parsing URL with id " +bookmark_id+"and loop id is"+i);
                    var bookmark_title = response.title;
                    var body             = response.html;
                    var timestamp           = new Date().getTime().toString();
                    var file_name           = common_function.generateRandomString() + timestamp + '.txt';
                    var timestamp0 = new Date().getTime().toString();
                    var local_image_name = common_function.generateRandomString() + timestamp0 + i + '.jpg';
                    var preview_image = response.media[0]['link'];
                    if(response.media[0].primary=='true'){  
                            mainPreviewImage = "thumb_" + local_image_name;
                            viewImage = "thumbnail_" + local_image_name;
                            mediaExist=1;
                    }else{
                            mainPreviewImage="default_bookmark.png";
                            viewImage="thumbnail_default_bookmark1.png";
                            mediaExist=0;
                    }

                        callBackString .bookmark_title=bookmark_title;
                        callBackString.body = body;
                        callBackString.file_name = file_name;
                        callBackString.preview_image = preview_image;
                        callBackString.local_image_name =  local_image_name;
                        callBackString.mainPreviewImage = mainPreviewImage;
                        callBackString.viewImage=viewImage;
                        callBackString.mediaExist =mediaExist;
                        callback(null,callBackString);


            });

};

答案 1 :(得分:1)

使用async.js管理您的代码流

如果你有多个函数,func_1,func_2,func_3,需要按顺序运行,代码是

var async = require('async');

var functionList = [func_1, func_2, func_3];

async.series(functionList, function(err, result){
    // results of func_1, func_2 and func_3
});