Итак, я супер новый для асинхронного и не могу понять, как это работает, потому что я могу понять это, но когда я выполняю это, кажется, что я не понял.
Итак, у меня есть код, и я пытаюсь выполнить обещания последовательно и переносить переменные, и если он обнаружит ошибку, он поймает.
Вот мой простой код, который я пытаюсь:
var x = new Promise(function(resolve, reject) {
var one = 1
resolve(one)
// if error happens go to catch
})
.then(function(value) {
var two = 2;
resolve(two);
// if error happens go to catch
})
.then(function(value) {
var three = 3;
resolve(three);
// if error happens go to catch
})
.then(function(value) {
console.log(one + two + three);
})
.catch(function(value) {
// reverse all the execution
})
x;
Я создаю обещание, которое будет
1-е обещание с циклами for содержит некоторый объект для вставки
Второе обещание, которое вставит несколько строк в мою первую таблицу
Третье обещание, которое вставит несколько строк из первой таблицы и некоторые результаты второго обещания.
4-е обещание завершит что-то и т.д.
и ловушка, которая удалит данные, которые вставлены и обрезаны по ошибке.
это то, что я пытаюсь представить себе логику, код и исполнение.
Я использую MySQL, кстати. Для того, кто может мне помочь, пожалуйста, вы мне нужны. Thanksss
Если вам интересен реальный код, который я конвертирую, то это то, что я сделал до сих пор: https://pastebin.com/Ui5vcUDg
Я использую некоторые просто обещания и думаю, что если я использую цепочку обещаний, я могу сократить или очистить свой код.
Вот как вы можете передавать значения по цепочкам обещаний, создавая объект-накопитель, который вы затем передаете, добавляя свойство result на каждом шаге:
// Promises
var one = new Promise((resolve, reject) => {
resolve(1)
})
var two = new Promise((resolve, reject) => {
resolve(2)
})
var three = new Promise((resolve, reject) => {
resolve(3)
})
// Promise Chain
one.then(one => {
return ({ one })
})
.then(acc => {
return two.then(two => ({ ...acc, two }))
})
.then(acc => {
return three.then(three => ({ ...acc, three }))
})
.then(result => {
console.log(result)
})
.catch(err => {
console.error('one, two or three failed', err)
})
Что касается обработки ошибок, если какое-либо из возвращенных Promises внутри цепочки Promise отклоняется, цепочка разрывается и запускается ее обработчик catch
.
// Promises
var one = new Promise((resolve, reject) => {
reject(new Error('Promise one error :('))
})
var two = new Promise((resolve, reject) => {
resolve(2)
})
// Promise Chain
one.then(one => {
return ({ one })
})
.then(acc => {
return two.then(two => ({ ...acc, two }))
})
.then(result => {
console.log(result)
})
.catch(err => {
console.error(err)
})
Вы также можете вызвать ошибку самостоятельно, throw
ING в пределах then
:
var one = new Promise((resolve, reject) => {
resolve(1)
})
var two = new Promise((resolve, reject) => {
resolve(2)
})
one.then(one => {
return ({ one })
})
.then(acc => {
throw new Error('Error by explicit throw')
})
.then(acc => {
return two.then(two => ({ ...acc, two }))
})
.then(result => {
console.log(result)
})
.catch(err => {
console.error(err)
})
Замечания:
two.then(two => ({ ...acc, two }))
примерно эквивалентно:
two.then(two => {
acc.two = two
return acc
})
в случае, если этот синтаксис сбивает с толку.
В обратных вызовах, которые вы помещаете в "then", вам не нужно вызывать resol(), чтобы вызвать следующий шаг цепочки. Вам просто нужно вернуть какое-то значение, и следующий шаг цепочки получит его в качестве аргумента.
Вы, вероятно, перепутали способ создания и связывания обещаний. Когда вы создаете обещание, вы предоставляете его конструктору обратный вызов, аргументами которого являются "resol" и "reject", которые также являются обратными вызовами. Ожидается, что они будут вызываться кодом внутри обратного вызова внутри конструктора обещания. Когда вы вызываете функцию разрешения, обещание будет разрешено со значением, указанным для разрешения. То же самое с отклонением.
Эта тема, безусловно, сбивает с толку, я рекомендую вам поближе познакомиться с тем, как люди связывают обещания и как люди создают индивидуальные обещания.
Если вы хотите объединить функции в цепочку на основе обратного вызова и хотите передать результаты в другую функцию по очереди. Вы можете использовать waterfall
модель async
библиотеки. В библиотеке доступно множество асинхронных функций с различными рабочими процессами. Для вашего примера вы можете сделать что-то вроде этого:
async.waterfall([
function(callback) {
callback(null, 'one', 'two');
},
function(arg1, arg2, callback) {
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
},
function(arg1, callback) {
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
// the error and the end result can be caught here.
});
Водопад выполняет все функции в последовательности и передает результат другой функции в последовательности. Если возникает ошибка, она выходит из процесса и выдает исключение. Для получения более подробной информации просмотрите документацию: https://caolan.github.io/async/docs.html#waterfall
resolve()
находится в области действия аргументаresolve
поэтому ни один из остальных не будет работать. Это всего лишь дикая догадка (потому что код не имеет смысла), но, вероятно, вам нужноthrow someError
в любой из обработчиков.then()
чтобы в конце он.catch()
к.catch()
.return
, а неresolve
.