在蓝鸟承诺中执行异步操作



所以,我已经打了这个几天了,我对解决它的最佳方法感到困惑。 我正在将水线/狗水与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会使代码异步。 我试图介绍承诺(蓝鸟),但没有运气。我什至查看了生成器 (Co),但我的节点版本固定在 v0.11 之前。

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

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与异步性无关。这只是一种下划线/lodash 方法来做trousers.forEach(...).

您的问题与执行异步操作的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');
        });
    });
});

相关内容

  • 没有找到相关文章

最新更新