gpt4 book ai didi

node.js - 在 bluebird Promise 中执行异步操作

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:58 25 4
gpt4 key购买 nike

所以,我已经解决这个问题几天了,我很困惑什么是解决它的最佳方法。我正在将 Waterline/dogwater 与 HAPI 一起使用,并尝试做一些大致如下的事情:-

wardrobe.find({WardrobeId: 5}).then(function(clothes) {
//got my clothes in my wardrobe.
clothes.find({Type: 'trousers'},{Kind: 'nice ones'}).then(function(trousers) {
//got my nice trousers
_.each(trousers, function(trouser) {
//logic to see if these are my pink trousers
console.log('color?', trouser.color);
});
console.log('ding');
});
});

我遇到的麻烦是代码在输出裤子颜色之前总是会ding。这是因为,据我了解, _.each 将使代码异步。我尝试引入 Promises (bluebird),但没有成功。我什至查看了生成器 (Co),但我的 Node 版本固定为 v0.11 之前的版本。

我想在 _.each 中执行一些数据库查找,将这些结果(如果有)返回到 trouser 对象,然后可以返回该对象:-

wardrobe.find({WardrobeId: 5}).then(function(clothes) {
//got my clothes in my wardrobe.
clothes.find({Type: 'trousers'},{Kind: 'nice ones'}).then(function(trousers) {
//got my nice trousers
_.each(trousers, function(trouser) {
//logic to see if these are my pink trousers
db.colors.find({Color: trouser.color}).then(function(color) {
//color here?
});
});
console.log('ding');
});
});

尽可能高效地完成此操作的最佳方法是什么?

感谢帮助。很高兴回到这里并在需要的地方关注问题。

最佳答案

好吧_.each与异步性无关。这只是执行 trousers.forEach(...) 的下划线/lodash 方式。

您的问题在于执行异步操作的db.colors.find方法。如果您希望方法按顺序执行,您可以链接这些方法:

wardrobe.find({WardrobeId: 5}).then(function(clothes) {
//got my clothes in my wardrobe.
clothes.find({Type: 'trousers'},{Kind: 'nice ones'}).then(function(trousers) {
//got my nice trousers
var p = Promise.resolve();
_.each(trousers, function(trouser) {
//logic to see if these are my pink trousers
p = p.then(function() {
return db.colors.find({Color: trouser.color})
.then(function(color) {
// color here, they'll execute one by one
});
});
});
p.then(function(){
console.log('ding, this is the last one');
});
});
});

或者,如果您希望它们同时发生而不是等待上一个:

wardrobe.find({WardrobeId: 5}).then(function(clothes) {
//got my clothes in my wardrobe.
clothes.find({Type: 'trousers'},{Kind: 'nice ones'}).then(function(trousers) {
//got my nice trousers
Promise.map(trousers, function(trouser) {
return db.colors.find({Color: trouser.color});
}).map(function(color){
console.log("color", color);
}).then(function(){
console.log('ding, this is the last one');
});
});
});

关于node.js - 在 bluebird Promise 中执行异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26912580/

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