在下面的代码中,链接到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)
})
答案 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)