gpt4 book ai didi

javascript - 如何使用 "q"模块重构 mongoose 代码?

转载 作者:可可西里 更新时间:2023-11-01 01:17:33 25 4
gpt4 key购买 nike

我正在使用 mongoose 将一些数据插入 mongodb。代码如下:

var mongoose = require('mongoose');
mongoose.connect('mongo://localhost/test');
var conn = mongoose.connection;

// insert users
conn.collection('users').insert([{/*user1*/},{/*user2*/}], function(err, docs) {
var user1 = docs[0], user2 = docs[1];

// insert channels
conn.collection('channels').insert([{userId:user1._id},{userId:user2._id}], function(err, docs) {
var channel1 = docs[0], channel2 = docs[1];

// insert articles
conn.collection('articles').insert([{userId:user1._id,channelId:channel1._id},{}], function(err, docs) {
var article1 = docs[0], article2 = docs[1];

}
});
};

你可以看到那里有很多嵌套回调,所以我尝试使用 q重构它。

我希望代码看起来像这样:

Q.fcall(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function (value4) {
// Do something with value4
}, function (error) {
// Handle any error from step1 through step4
})
.end();

但是我不知道怎么做。

最佳答案

您需要使用 Q.nfcall,已记录 in the README和维基。所有 Mongoose 方法都是 Node 风格的。我还将使用 .spread 而不是手动解构 .then

var mongoose = require('mongoose');
mongoose.connect('mongo://localhost/test');
var conn = mongoose.connection;

var users = conn.collection('users');
var channels = conn.collection('channels');
var articles = conn.collection('articles');

function getInsertedArticles() {
return Q.nfcall(users.insert.bind(users), [{/*user1*/},{/*user2*/}]).spread(function (user1, user2) {
return Q.nfcall(channels.insert.bind(channels), [{userId:user1._id},{userId:user2._id}]).spread(function (channel1, channel2) {
return Q.nfcall(articles.insert.bind(articles), [{userId:user1._id,channelId:channel1._id},{}]);
});
})
}

getInsertedArticles()
.spread(function (article1, article2) {
// you only get here if all three of the above steps succeeded
})
.fail(function (error) {
// you get here if any of the above three steps failed
}
);

在实践中,您很少想使用.spread,因为您通常会插入一个不知道其大小的数组。在那种情况下,代码可以看起来更多 like this (这里我也说明了Q.nbind)。


与原版比较不太公平,因为您的原版没有错误处理。原始版本的更正节点样式版本如下所示:

var mongoose = require('mongoose');
mongoose.connect('mongo://localhost/test');
var conn = mongoose.connection;

function getInsertedArticles(cb) {
// insert users
conn.collection('users').insert([{/*user1*/},{/*user2*/}], function(err, docs) {
if (err) {
cb(err);
return;
}

var user1 = docs[0], user2 = docs[1];

// insert channels
conn.collection('channels').insert([{userId:user1._id},{userId:user2._id}], function(err, docs) {
if (err) {
cb(err);
return;
}

var channel1 = docs[0], channel2 = docs[1];

// insert articles
conn.collection('articles').insert([{userId:user1._id,channelId:channel1._id},{}], function(err, docs) {
if (err) {
cb(err);
return;
}

var article1 = docs[0], article2 = docs[1];

cb(null, [article1, article2]);
}
});
};
}

getInsertedArticles(function (err, articles) {
if (err) {
// you get here if any of the three steps failed.
// `articles` is `undefined`.
} else {
// you get here if all three succeeded.
// `err` is null.
}
});

关于javascript - 如何使用 "q"模块重构 mongoose 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10545087/

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