即使被拒绝的方法中没有返回函数,我的promise也会先返回promise

时间:2018-09-26 08:12:18

标签: javascript node.js web es6-promise

在下面的代码中,链接到addTwo函数的第一个.then()调用reject方法,因为我正在检查a和b的类型是否为“ choco”,这是不可能的。

我希望输出在“我们有一个错误老板”处停止而不继续,因为与resolve方法不同,拒绝方法没有“ return addTwo”语句。

但是输出显示该代码继续进行下一个然后调用,并且输出为“第二次添加的答案:未定义”。由于拒绝方法没有返回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 :(得分:0)

您的代码中有两个错误,为了使其按预期工作,您需要这样编写:

    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;
}})

答案 1 :(得分:0)

只有一个共同点。我已经更新了您的代码。

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)
})

答案 2 :(得分:0)

将承诺链视为具有两个链-已实现和被拒绝

此外,您知道.then接受两个参数window.addEvent('scroll',function(e) { if (document.body.scrollTop > 50 || document.documentElement.scrollTop > 50) { // enter code here } }); -如果.then(onFulfilled, onRejected)onFulfilled中的一个不是函数,则将其忽略

onRejected只是.catch(fn)

.then(null, fn)执行的每个函数中(onFulfilled或onRejected),如果引发错误,则下一个调用.then的{​​{1}}-否则调用.then接下来将被称为

如果onRejected的任何参数都不是函数,则.then忽略它们-在onFulfilled不是函数的情况下,.then将返回一个已解决的Promise,它采用已实现(已解决)的值-并且在onRejected不是函数的情况下,.then将返回具有拒绝值的拒绝Promise

您的代码是字面上的(只是显示返回值,而忽略console.logs)

onFulfilled

由于第一个.then函数返回addTwo(5, 6) .then(res => addTwo(res, 100), err => undefined) .then(res => undefined, err => undefined); ,因此将调用第二个onRejected

在另一个答案中建议,在这种情况下,您需要一个.catch

如此

undefined

哪个-没有console.logs

.then(res=>

由于第一个和第二个.then 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) }); 为空,即不是一个函数,因此“错误”沿着拒绝的链向下流动,直到“找到”一个函数

答案 3 :(得分:0)

具有实用的样式和一些帮助程序,您可以通过简单易懂的方式解决此问题:

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)