Я новичок в использовании узла js, поэтому очень вероятно, что я неправильно понимаю понятие «обещание» и «обратный ад». В любом случае, мне нужно предложения о том, как избежать следующего кода:Остановить продолжение цепочки обещаний без вызова ада
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 из этих вложенных операторов обратного вызова.
Есть ли альтернативы для меня, чтобы учесть все эти функции обратного вызова?
Кажется, что вы можете поместить все эти запросы в массив, а затем просто использовать одну функцию для каждого из них по одному, останавливаясь при возникновении ошибки. – jfriend00
@ jfriend00, если вы предлагаете приведенный ниже ответ robertklep, я попробовал это, но столкнулся с проблемой, когда последующие функции '.then()' продолжали запускать после ошибочного запроса в рамках одной из функций .then(). Я пытаюсь выяснить, как остановить поток '.then()' function from firing – John