我使用Hapi Js和Sequelize对我的API做了一些事情,在这种情况下,我需要先检查一切,然后再进行下一步。
这是我的代码
return promise.map(array, function (values) {
models.Goods.find({
where: {
id: values.id
}
}).then(function (res) {
if (!res || res.length === 0) {
throw new Error("Item not found");
}
});
}).then(function (res) {
//do something after check
//next step
}).catch(function(error) {
console.log(error.message);
});
我需要在下一步之前检查id是否在我的数据库中,但在此代码中如果有任何错误,throw new Error("Item not found");
永远不会转到catch function
,所以我尝试做得到错误功能的东西。我更改了promise.map
中的代码,我在models.Goods
中添加了catch函数并且console.log
出现了错误,错误显示但promise.map
仍在运行并转到{{ 1}}部分而不是停止。
如果//next step
promise.map
如何中断
谢谢
答案 0 :(得分:1)
我认为你只是忘了归还模特,这个
return promise.map(array, function (values) {
models.Goods.find({
where: {
应该是:
return promise.map(array, function (values) {
return models.Goods.find({
where: {
如果使用箭头SO,您可以省略return
关键字
这是一个例子,我也加入了一些functions。
return promise.map(array, ({id}) =>
models.Goods.find({
where: {id}
}).then(res => {
if (!res || res.length === 0) {
throw new Error("Item not found");
}
}) // can't have ; here now
).then(res => {
// do something after check
// next step
}).catch(error => {
console.log(error.message);
});
答案 1 :(得分:0)
如果未找到用户,则查询本身成功,因此会触发成功回调。但由于没有与您的查询匹配,因此返回null。这就是为什么它首先不会触发错误。至于第二部分。
您无法捕获使用promises在异步回调函数中抛出的错误,因为它的上下文将丢失。
使用promises,正确的解决方案是拒绝包装承诺。
Promise.reject(new Error('fail')).then(function(error) {
// not called
}, function(error) {
console.log(error); // Stacktrace
});