Перенос ценностей по цепочке Promise

1

Итак, я супер новый для асинхронного и не могу понять, как это работает, потому что я могу понять это, но когда я выполняю это, кажется, что я не понял.

Итак, у меня есть код, и я пытаюсь выполнить обещания последовательно и переносить переменные, и если он обнаружит ошибку, он поймает.

Вот мой простой код, который я пытаюсь:

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

Я использую некоторые просто обещания и думаю, что если я использую цепочку обещаний, я могу сократить или очистить свой код.

  • 2
    Можете ли вы показать нам свой реальный код или реальную проблему, а не этот выдуманный код. Затем мы можем показать вам правильный способ решения актуальной проблемы. Этот составленный код не имеет никакого смысла, потому что только первый вызов resolve() находится в области действия аргумента resolve поэтому ни один из остальных не будет работать. Это всего лишь дикая догадка (потому что код не имеет смысла), но, вероятно, вам нужно throw someError в любой из обработчиков .then() чтобы в конце он .catch() к .catch() .
  • 0
    Кстати, если вы хотите вернуть значение следующему обещанию, просто используйте return , а не resolve .
Показать ещё 1 комментарий
Теги:
promise

3 ответа

1

Вот как вы можете передавать значения по цепочкам обещаний, создавая объект-накопитель, который вы затем передаете, добавляя свойство 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
})

в случае, если этот синтаксис сбивает с толку.

  • 0
    Значит ли это, что мне нужно создать обещания, прежде чем я смогу их связать? сожалею
  • 1
    @CherylBlossom Ваши методы БД возвращают обещания? Какой модуль узла вы используете для связи с вашей БД? Если они уже возвращают Обещания, вам просто нужно их связать. Если они используют обратные вызовы, вам нужно обернуть их в Обещания.
Показать ещё 5 комментариев
0

В обратных вызовах, которые вы помещаете в "then", вам не нужно вызывать resol(), чтобы вызвать следующий шаг цепочки. Вам просто нужно вернуть какое-то значение, и следующий шаг цепочки получит его в качестве аргумента.

Вы, вероятно, перепутали способ создания и связывания обещаний. Когда вы создаете обещание, вы предоставляете его конструктору обратный вызов, аргументами которого являются "resol" и "reject", которые также являются обратными вызовами. Ожидается, что они будут вызываться кодом внутри обратного вызова внутри конструктора обещания. Когда вы вызываете функцию разрешения, обещание будет разрешено со значением, указанным для разрешения. То же самое с отклонением.

Эта тема, безусловно, сбивает с толку, я рекомендую вам поближе познакомиться с тем, как люди связывают обещания и как люди создают индивидуальные обещания.

-1

Если вы хотите объединить функции в цепочку на основе обратного вызова и хотите передать результаты в другую функцию по очереди. Вы можете использовать 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню