gpt4 book ai didi

javascript - 打破 Mongoose 中的 Bluebird promise 链

转载 作者:行者123 更新时间:2023-11-30 15:26:57 25 4
gpt4 key购买 nike

我已经研究了几个相关的问题和答案,但仍然找不到我想要做的事情的解决方案。我将 Mongoose 与 Bluebird 一起用于 promises。

我的 promise 链包括 3 个部分:

  1. 通过用户名获取用户1

  2. 如果找到用户 1,则通过用户名获取用户 2

  3. 如果用户1和用户2都找到了,存储一条新记录

如果第 1 步或第 2 步未能返回用户,我不想执行第 3 步。但是,未能返回用户不会导致数据库错误,因此我需要检查有效用户手动。

我可以在第 1 步使用 Promise.reject(),它会跳过第 2 步,但仍会执行第 3 步。其他答案建议使用 cancel(),但我似乎也无法做到这一点。

我的代码如下。 (我的函数 User.findByName() 返回一个 promise 。)

var fromU,toU;
User.findByName('robfake').then((doc)=>{
if (doc){
fromU = doc;
return User.findByName('bobbyfake');
} else {
console.log('user1');
return Promise.reject('user1 not found');
}
},(err)=>{
console.log(err);
}).then((doc)=>{
if (doc){
toU = doc;
var record = new LedgerRecord({
transactionDate: Date.now(),
fromUser: fromU,
toUser: toU,
});
return record.save()
} else {
console.log('user2');
return Promise.reject('user2 not found');
}

},(err)=>{
console.log(err);
}).then((doc)=>{
if (doc){
console.log('saved');
} else {
console.log('new record not saved')
}

},(err)=>{
console.log(err);
});

最佳答案

例子

你需要做的就是这样:

let findUserOrFail = name =>
User.findByName(name).then(v => v || Promise.reject('not found'));

Promise.all(['robfake', 'bobbyfake'].map(findUserOrFail)).then(users => {
var record = new LedgerRecord({
transactionDate: Date.now(),
fromUser: users[0],
toUser: users[1],
});
return record.save();
}).then(result => {
// result of successful save
}).catch(err => {
// handle errors - both for users and for save
});

更多信息

你可以创建一个函数:

let findUserOrFail = name =>
User.findByName(name).then(v => v || Promise.reject('not found'));

然后你就可以随心所欲地使用它了。

例如你可以这样做:

Promise.all([user1, user1].map(findUserOrFail)).then(users => {
// you have both users
}).catch(err => {
// you don't have both users
});

这种方式会更快,因为您不必等待第一个用户获得第二个用户 - 两者都可以并行查询 - 并且您可以在未来将其扩展到更多用户:

let array = ['array', 'with', '20', 'users'];
Promise.all(array.map(findUserOrFail)).then(users => {
// you have all users
}).catch(err => {
// you don't have all users
});

没有必要比这更复杂了。

关于javascript - 打破 Mongoose 中的 Bluebird promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42816154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com