gpt4 book ai didi

node.js - Nodejs Mongoose - 如何避免回调 hell ?

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

使用 Mongoose 一段时间后,我可能会做错。当你有太多回调时,我发现很难阅读,例如:

我想找到一个文档并更新它。我需要先找到它,然后 update 将位于 findOne 的回调中。

var sam = new Character({ name: 'Sam', inventory: {}});

Character.findOne({ name: 'Sam' }, function(err, character) {
console.log(character);

// now I want to update it.
character.update({... }, function(err, characterID) {

// now I want to know the size of the document after the update.
Character.findOne({ _id: characterID }, function(err, character) {
// Now update it again....
});
});

});

最终会变成意大利面条式的代码!

你明白我的意思吗?

有什么想法可以做得更好吗?

或者 mongodb 原生在没有所有这些回调的情况下更好?

编辑:

Character.findOne({...}, function(err, character) {

return character.update(...);

}).select("-field1 -field2").then(function(data) {
//
}).catch(function(error) {
// Handle any error from all above steps
}).done();

错误:

TypeError: Character.findOne(...).select(...).then(...).catch(...).done is not a function

最佳答案

您可以使用 q promise in nodejs 的链接

var Q = require('q');

function findOne(filter) {
return Q.Promise(function(resolve, reject) {
Character.findOne(filter, function(err, character) {
resolve({
err: err,
character: character
});
});
});
}

function update(data) {
return Q.Promise(function(resolve, reject) {
character.update(data, function(err, characterID) {
resolve({
err: err,
characterID: characterID
});
});
});
}

findOne({ name: 'Sam' }).then(function(data) {
if (!data.err) {
// now you can update it.
return update(data.character);
} else {
throw new Error(data.err);
}
}).then(function(data) {
if (!data.err) {
// now you can update it.
return update(data.characterId);
} else {
throw new Error(data.err);
}
return findOne({ id: characterId });
}).then(function(data) {
if (!data.err) {
// now you can update it.
return update(data.character);
} else {
throw new Error(data.err);
}
}).catch(function(error) {
// Handle any error from all above steps
}).done();

关于node.js - Nodejs Mongoose - 如何避免回调 hell ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43014748/

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