Первый, затем для моего обещания возвращает обещание, даже если в отклоненном методе нет функции возврата. - PullRequest
0 голосов
/ 26 сентября 2018

В приведенном ниже коде первый .then (), связанный с функцией addTwo, вызывает метод reject, потому что я проверяю, являются ли типы a и b «choco», что невозможно.

Я ожидал, что вывод остановится на «у нас есть ошибка», так как метод отклонения, в отличие от метода разрешения, не имеет оператора return addTwo.

Но выходные данные показывают, что код переходит к следующему, а затем к вызову, а выходной результат - «ответ второго добавления: неопределенный».Почему код не просто останавливается на первом, а затем на вызове, поскольку метод reject не возвращает Promise?

var addTwo = (a, b) => {
    return new Promise((resolve, reject) => {   
        if(typeof a === choco && typeof b === choco){
            resolve(a + b)
        }else{
            reject("a or b or both were not numbers")
        }
    })
}


addTwo(5, 6).then((res) => {
    console.log("Answer of addition: " + res)
    return addTwo(res, 100)
}, (err) => {
    console.log("We have an error boss: " + err)
}).then((res) => {
    console.log("Answer of second addition: " + res)
}, (err) => {
    console.log("We have an error boss: " + err)
})

Ответы [ 4 ]

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

С функциональным стилем и некоторыми помощниками вы можете решить эту проблему простым и понятным способом:

import { curry } from 'crocks/helpers/curry'

// async functions always return promises
const addPromise = curry(async (a, b) => {
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw new Error("a or b or both were not numbers")
  } else {
    return a + b
  }
})

const trace = tag => x => console.log(tag, x) || x

const handleError = err => console.log(`We have an error boss: ${err}`)

addPromise(5, 6)
  .then(trace('Answer from First Addition'))
  .then(addPromise(100))
  .then(trace('Answer from Second Addition'))
  .catch(handleError)
0 голосов
/ 26 сентября 2018

просто есть общий улов.Я обновил ваш код.

addTwo(5, 6).then((res) => {
    console.log("Answer of addition: " + res)
    return addTwo(res, 100);
}).then((res) => {
    console.log(res);
    console.log("Answer of second addition: " + res)
}).catch((err) => {
    console.log("We have an error boss: " + err)
})
0 голосов
/ 26 сентября 2018

Представьте, что цепочки обещаний имеют две цепочки - выполненные и отклоненные

Кроме того, вы знаете, что .then принимает два аргумента .then(onFulfilled, onRejected) - если один из onFulfilled или onRejected не является функцией, он игнорируется

.catch(fn) просто .then(null, fn)

В каждой из функций, выполняемых .then (либо onFulfilled или onRejected), если выдается ошибка, то следующая.then 'onRejected будет вызван следующим - в противном случае onFulfilled будет вызван следующим

Если какой-либо из аргументов .then не является функцией, .then игнорирует их - в случаеесли onFulfilled не является функцией, .then будет возвращать разрешенное обещание, которое принимает выполненное (разрешенное) значение, а в случае, когда onRejected не является функцией, .then будет возвращать отклоненное обещание, которое принимает отклоненное значение * 1019.*

Ваш код буквально (просто показывает возвращаемые значения, игнорируя console.logs)

addTwo(5, 6)
.then(res => addTwo(res, 100), err => undefined)
.then(res => undefined, err => undefined);

, так как первая функция onRejected возвращает undefined, вторая .then(res=> будет вызываться

AsВ другом ответе предлагается один .catch в этом случае

, поэтому

    addTwo(5, 6)
   .then((res) => {
        console.log("Answer of addition: " + res)
        return addTwo(res, 100)
    })
    .then((res) => {
        console.log("Answer of second addition: " + res)
    })
    .catch((err) => {
        console.log("We have an error boss: " + err)
    });

То есть - без console.logs

addTwo(5, 6)
.then(res => addTwo(res, 100), null)
.then(res => undefined, null)
.then(null, err => undefined);

с момента первогои во-вторых, затем имеют значение NULL для onRejected, то есть не является функцией, «ошибка» стекает по отклоненной цепочке, пока функция не «найдена»

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

В вашем коде есть две ошибки, чтобы он работал так, как вы предполагали, вам нужно написать его так:

    var addTwo = (a, b) => {
    return new Promise((resolve, reject) => {   
        if(typeof a === choco && typeof b === choco){
            resolve(a + b)
        }else{
            reject("a or b or both were not numbers")
        }
    })
}


addTwo(5, 6).then((res) => {
    console.log("Answer of addition: " + res);
    return addTwo(res, 100);
}, (err) => {
    console.log("We have an error boss: " + err);
    throw err;
}).then((res) => {
    res.then(res2) => {
        console.log("Answer of second addition: " + res2);
    }, (err) => {
        console.log("We have an error boss: " + err);
        throw err;
}})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...