Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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 node.js+;续集+;顺序执行_Javascript_Node.js_Callback_Promise_Sequelize.js - Fatal编程技术网

Javascript node.js+;续集+;顺序执行

Javascript node.js+;续集+;顺序执行,javascript,node.js,callback,promise,sequelize.js,Javascript,Node.js,Callback,Promise,Sequelize.js,在我的节点应用程序中,我必须执行两个查询,一个接一个(即,我必须根据第一个查询的结果执行第二个查询) 我的代码: var levels; try { sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) { levels = results;

在我的节点应用程序中,我必须执行两个查询,一个接一个(即,我必须根据第一个查询的结果执行第二个查询)

我的代码:

 var levels;
        try {
            sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) {
                levels = results;               
            }).failure(function(err) {
                if (err) {
                    logger.error(err.stack);
                    throw (err);
                }
                else {
                    if (callback) {
                        callback(err, null);
                    }
                }
            });
        }
        catch (err) {
        }


if (level == 2) {
        query = "select *from xxxxxx where " + query + " and leveltype = "+levels[0].name_2+"";-----------------------------------------------------------> this is from 1st query

        try {
            sequelize.query(query).success(function(results) {
                results = tsv.stringify(results);
                onSuccess(results, callback)
            }).failure(function(err) {
                if (err) {
                    logger.error(err.stack);
                    throw (err);
                }
                else {
                    if (callback) {
                        callback(err, null);
                    }
                }
            });
        }
        catch (err) {
            logger.error(err.stack)
        }
    }

请帮我解决这个问题。提前感谢。

Sequelize使用蓝鸟承诺:

sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) {
                levels = results;               
            }).failure(function(err) {
                if (err) {
                    logger.error(err.stack);
                    throw (err);
                }
                else {
                    if (callback) {
                        callback(err, null);
                    }
                }
            });
        }
可以转化为:

sequelize.query("Select * from levels where country_id = " + level0 + "")
         .then(function(results)  {
            levels = results;               
        });
承诺链:

sequelize.query("Select * from levels where country_id = " + level0 + "")
.then(function(levels)  {
     var query = "select *from xxxxxx where " + query + 
                 " and leveltype = "+levels[0].name_2+""
     return sequelize.query(query);
 }).nodeify(callback); // turn back from promise API to callback API
这段代码基本上完成了上面代码所做的一切:)

  • 你不需要用try/catch和if(err)来检查承诺,他们会帮你解决。如果你把一个承诺处理者扔进去,你就安全了
  • 承诺链,如果您从中返回承诺的值,那么它将使用该承诺解析它(意味着您可以添加
    。然后
    处理程序)

不过,您可以做得更好,您可以返回承诺的值(即-
返回sequelize.query
)并完全切换到承诺API。

我不熟悉sequelize模块。在node_sqlite3中,可以通过在第一个查询的成功回调中发送第二个查询来对查询排序,然后在第二个查询的成功回调中发送第二个查询,您知道这两个查询都成功了。感谢您宝贵的时间。。作为@Paul sad,我已经在第一个的成功模块中执行了第二个查询。它对我有效。是否建议这样做。。另外,对于您上面的代码,我是否必须安装任何软件包???@Subburaj,您认为哪种代码更长、更可读?此外,Paul所建议的方法忽略了免费获得的强大promise API的要点——请参阅我的问答:解释我所建议方法的优点。您还可以使用
.nodeify