停止回叫承诺链,不回叫地狱

编程入门 行业动态 更新时间:2024-10-08 01:33:04

停止回叫承诺链,<a href=https://www.elefans.com/category/jswz/34/1702749.html style=不回叫地狱"/>

停止回叫承诺链,不回叫地狱

我是使用Node js的新手,所以很可能我误解了“ promise”和“ callback hell”的概念。无论如何,我都需要有关如何避免以下代码的建议:

var Sequelize = require('sequelize');
var DB = new Sequelize('project1db', 'john', 'password123', {
  host: 'localhost',
  dialect: 'mysql'
});


var DB_PREFIX = 't_';

DB.query(
'CREATE TABLE IF NOT EXISTS `'+DB_PREFIX+'user` ( ' +
'`user_id` int(11) UNSIGNED NOT NULL' +
') ENGINE=InnoDB DEFAULT CHARSET=utf8;',{type: DB.QueryTypes.RAW})
.then(function(results) {
    DB.query(
    'CREATE TABLE IF NOT EXISTS `'+DB_PREFIX+'organization` ( ' +
    '`organization_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT ' +
    ') ENGINE=InnoDB DEFAULT CHARSET=utf8; ', {type:DB.QueryTypes.RAW})
    .then(function(results) {
        DB.query(
        'CREATE TABLE IF NOT EXISTS `'+DB_PREFIX+'user_organization` ( ' +
        '`user_id` int(11) UNSIGNED NOT NULL ' +
        ') ENGINE=InnoDB DEFAULT CHARSET=utf8; ')
        .then(function(){
            DB.query(
            'CREATE TABLE IF NOT EXISTS `'+DB_PREFIX+'content` ( ' +
            '`content_id` int(11) UNSIGNED NOT NULL ' +
            ') ENGINE=InnoDB DEFAULT CHARSET=utf8; ', {type:DB.QueryTypes.RAW})
            .then(function(){
            // more queries
            }).catch(function(err){console.log(err);});
        }).catch(function(err){console.log(err);});
    }).catch(function(err){console.log(err);});
}).catch(function(err){console.log(err);});

忽略了我用SQL创建表而不是使用Sequelize迁移脚本的事实,因为我只是想说明我有很多应该按顺序运行的mysql查询。如果查询失败,那么我需要停止整个脚本,而不要触发后续的.then()函数。在我的Sequelize代码中,我通过嵌套许多原始查询函数调用,然后嵌套了catch语句来实现这一点。如果我有100个这些嵌套的回调语句,这将很难解决。

除了嵌套所有这些回调函数之外,我还有其他选择吗?

回答如下:

Sequelize使用bluebird promises库(的修改版本),这意味着它应该起作用:

bluebird

[它使用var Promise = Sequelize.Promise; Promise.each([ 'CREATE TABLE IF NOT EXISTS `'+DB_PREFIX+'user` ( ' + '`user_id` int(11) UNSIGNED NOT NULL' + ') ENGINE=InnoDB DEFAULT CHARSET=utf8;', 'CREATE TABLE IF NOT EXISTS `'+DB_PREFIX+'organization` ( ' + '`organization_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT ' + ') ENGINE=InnoDB DEFAULT CHARSET=utf8; ', 'CREATE TABLE IF NOT EXISTS `'+DB_PREFIX+'user_organization` ( ' + '`user_id` int(11) UNSIGNED NOT NULL ' + ') ENGINE=InnoDB DEFAULT CHARSET=utf8; ', 'CREATE TABLE IF NOT EXISTS `'+DB_PREFIX+'content` ( ' + '`content_id` int(11) UNSIGNED NOT NULL ' + ') ENGINE=InnoDB DEFAULT CHARSET=utf8; ', ], function runQuery(query) { return DB.query(query, { type: DB.QueryTypes.RAW }); }).then(function() { console.log('all done'); }).catch(function(err) { console.log(err); }); 的静态版本,它将顺序地遍历数组项,将每个项传递给.each()迭代器(返回承诺),并在拒绝承诺时停止。

更多推荐

停止回叫承诺链,不回叫地狱

本文发布于:2024-05-07 09:20:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1755578.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:不回   地狱

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!