Есть ли способ покончить с цепочкой? - PullRequest
0 голосов
/ 26 сентября 2018
let textProcess = new Promise((resolve, reject) => {
    let text
    try {
        // fetch text from the internet
        text = "str"
        resolve(text)
    } catch (e) {
        reject("failed to fetch!")
    }
})

textProcess.then(data => {
    let json
    try {
        json = JSON.parse(data)
    } catch (e) {
        console.error("failed to parse!")
        // ..........i want to end the whole process here, never go ahead
    }
}, e => {
    // try to fetch text from local chache
}).then(json => {
    // work on the json obj
}, e => {
    // if failed to fetch from local too, just let it go
})

Есть ли способ завершить цепочку с возможностью отображения?

Посмотрите на приведенный выше пример, я хочу завершить весь процесс при сбое синтаксического анализа (строка предшествует ".......... ").Но на самом деле последнее все равно будет задействовано.

Как правильно и элегантно достичь своей цели?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Короткий ответ - нет, нет механизма для завершения цепочки обещаний в обработчике then на полпути вниз по цепочке.(Предложение об отмене обещания было внесено в комитет TC39 в 2016 году, но впоследствии было отозвано.)

Обратите внимание, что «цепочка обещаний» часто относится к обещанию, возвращенному последний then, catch или finally вызов в цепочке вызовов методов одного обещания, соединенных вместе.

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

Поскольку обещания имеют только три состояния (ожидающие, выполненные и отклоненные), лучшее, что вы можете сделать, - это организовать "«Отмена» для отправки по каналу отклонения связанных обещаний и игнорировать его при необходимости.(Нет стандартного «отмененного» значения отклонения для использования).

0 голосов
/ 26 сентября 2018

Использование Promise включает в себя несколько неоптимальных шаблонов.Их исправление фактически приводит к тому, чего вы пытаетесь достичь.

textProcess.then(data => {
  // 1st anti-pattern fix
  // any error triggered here
  // also gets caught at the end catch
  return JSON.parse(data)
}).then(json => {
  // work on json obj
}).catch(e => {
  // 2nd anti-pattern fix
  // one catch for the whole thenable chain
  console.error("Failed to parse!", e)
})

Таким образом, вы правильно используете то, что предлагает Javascript Promise, и один простой .catch для того, что вам нужно.


Редактировать - некоторые пояснения по задействованным анти-шаблонам Promise

Отмеченный 1st anti-pattern относится к ненужному вложенному блоку try..catch внутри then.Внутри него вы можете синхронно возвратить (даже undefined) другое обещание (оба thenable) или выдать ошибку (которая может быть поймана catch).По сути, вам не нужно явно перехватывать его, но пусть он «течет» сквозь него.

2nd anti-pattern Как уже упоминалось, тот факт, что второй параметр - обработчик отклонения then считается субоптимальнымв большинстве случаев использования.Цепочка Promise должна использовать одну catch, чтобы упростить рабочий процесс.

Однако в редких случаях, когда необходимо выполнить «ранний поиск» и «возобновление», рассмотрите следующий способ, который все ещебит яснее, чем использование двух обработчиков для then:

textProcess.then(data => {
  return parser1(data)
}).catch(e => {
  console.log("First parser failed")
  // for example first parser failed
  return "fallback data"
}).then(data => {
  // process received data as "fallback data"
}).catch(e => {
  // always have a "last resort" catch at the end of the workflow
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...