gpt4 book ai didi

sql - Sequelize Promises - Chaining Promises 和 Bluebird Promise.each、Promise.map、Promise.all 等

转载 作者:搜寻专家 更新时间:2023-10-31 23:52:17 28 4
gpt4 key购买 nike

我的用户 Controller 中有一个索引操作,其中我试图连续做两件事,并且在它们都有机会完成之前不执行所需的 res.json() 方法。

我有一个加入用户的友谊加入模型。一列是 frienderId,一列是 friendedId。在下面的索引函数中,期望的结果是我将以一个单一的用户对象结束,它是一个 friend 。下面有 promise 的原因是因为用户可能在 frienderId 列或 friendedId 列中,所以我必须从根本上解析 req.user 的 friend 的两种可能情况。

问题是最后返回的东西,I.E. res.json(result),总是返回正确的 friend ,但是,它总是在所需对象之前或之后返回一个空数组 []。我知道这个空数组来自两个未找到结果的 promise 场景之一。是否有某种类型的方法而不是像 sayyy..reject 这样的 resolve?其中如果被调用,整个 promise 不会被推送到 promise 数组?然后我可以测试 if (!friended) {reject} 或 if (!friender) {reject}

我知道 .each 正在枚举每个 promise 并给出每个 promise 的结果。但是,我不想要每个 promise 的结果,我只想访问每个 promise 运行的副作用。

谢谢!

index: function(req, res) {
var promiseArray = [];

promiseArray.push(new Promise(function(resolve) {
user.findById(req.user.id).then(function(user) {
user.getFrienders({
where: {
username: req.body.username
}
}).then(function(friender) {
resolve(friender[0])
})
})
}));

promiseArray.push(new Promise(function(resolve) {
user.findById(req.user.id).then(function(user) {
user.getFriendeds({
where: {
username: req.body.username
}
}).then(function(friended) {
resolve(friended[0])
})
})
}));

Sequelize.Promise.map(promiseArray, function(result) {
res.json(result);
});
}

最佳答案

首先,您对 Promise 的使用有点多余。由于 findById() 函数返回一个 promise ,您需要做的就是处理它。您不需要创建一个新的 Promise。你可以只说 promiseArray.push(user.findById ...)。您几乎可以正确使用 then 了。传递给 then 的函数是在解决 promise 时调用的函数,在这种情况下,在 findById 函数完成并返回一个值之后。 then 本身返回一个 promise ,该 promise 由其回调返回的值解析。因此,无论您希望在所有操作完成后在 promiseArray 中得到什么值,我假设 friended[0]friender[0] 您只需要在最后一个中返回该值然后 函数。在第一个 then 函数中,您还应该说 return user.findFriends( ...

您接下来需要做的是处理从 findById 函数返回的 promise 被拒绝的情况。您可以通过两种方式做到这一点。首先,您可以将第二个回调传递给 then,它将在 promise 被拒绝的情况下调用,并将拒绝的原因作为其参数。您可以在 then 之后使用 catch 而不是将两个函数传递给 then,这是我个人更喜欢做的,并传递您的拒绝回调捕捉catch 还返回一个由其回调返回的值解析的 promise 。您可以选择返回传入的原因,或您想要的任何值。因此,如果错误被拒绝,无论 catch 返回什么,最终都会出现在您的 promises 数组中。

仔细阅读可能会对您有所帮助 the documentation为了 promise 。诚然,我知道刚开始时我在使用 promises 时遇到了一些困难,但在阅读文档和编写示例之后,您就会掌握它并了解 promises 有多么有用。

如果是我,我会这样重构代码

    var frienderPromise = user.findById(req.user.id)
.then(function(user) {
return user.getFrienders({
where: { username: req.body.username }
});
})
.then(function (friender) {
return friender[0];
})
.catch(function (reason) {
return reason; // or whatever else you want to end up in the promisesArray on rejection
});

var friendedPromise = user.findById(req.user.id)
.then(function(user) {
return user.getFriendeds({
where: { username: req.body.username }
});
})
.then(function (friended) {
return friended[0];
})
.catch(function (reason) {
return reason;
});

promiseArray.push(frienderPromise);
promiseArray.push(friendedPromise);

您可以保持其他一切不变。最后,您仍然可以像当前一样调用 Sequalize。虽然应该是return Sequalize...。如果您不想保留不良结果,您还可以考虑使用 Promise.filter 而不是 .map。所以你可以做类似的事情

    return Sequelize.Promise.filter(promiseArray, function(result) {
if (/* make sure it's result you want */)
res.json(result);
});

就我个人而言,我会更进一步,将所有 promise 业务移除到另一个对 res 不做任何事情的函数中,并用

结束它
    return Sequelize.Promise.filter(promiseArray, function(result) {
return result === /* result you want */;
});

然后一旦进入你的 index 函数,你就可以调用

    return friendsPromiseFunction().then(function (results) {
res.json(results);
})

它会让事情变得更干净。

关于sql - Sequelize Promises - Chaining Promises 和 Bluebird Promise.each、Promise.map、Promise.all 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39583099/

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