दूसरे मॉडल से उत्पाद आईडी निकालने के लिए आपको अपनी कॉलों को नेस्ट करना होगा। उदाहरण के लिए, उत्पाद
. से उत्पाद को निकालने के लिए आपके कॉल में संग्रह, आप पार्टनर
. से रेफरी हटाने के लिए एक और कॉल भी कर सकते हैं परिणाम कॉलबैक के भीतर मॉडल। उत्पाद को डिफ़ॉल्ट रूप से हटाने से उसके अभियान
के संदर्भ निकल जाएंगे नमूना।
निम्नलिखित कोड उपरोक्त अंतर्ज्ञान को दर्शाता है:
var campSchema = require('../model/camp-schema');
router.post('/removeProduct', function (req, res) {
campSchema.Product.findOneAndRemove({ _id: req.body.productId }, function (err, response) {
if (err) throw err;
campSchema.Partner.update(
{ "products": req.body.productId },
{ "$pull": { "products": req.body.productId } },
function (err, res){
if (err) throw err;
res.json(res);
}
);
});
});
संबद्ध अभियानों को निकालने के लिए आपको एक अतिरिक्त निकालने की कार्रवाई की आवश्यकता हो सकती है जो किसी दिए गए उत्पाद आईडी से संबंधित अभियान आईडी लेता है। निम्न गंदे हैक पर विचार करें जो संभावित रूप से आपको कॉलबैक नरक के लिए एकतरफा टिकट प्रदान कर सकता है। अगर कॉलबैक नेस्टिंग से सावधान नहीं हैं:
router.post('/removeProduct', function (req, res) {
campSchema.Product.findOneAndRemove(
{ _id: req.body.productId },
{ new: true },
function (err, product) {
if (err) throw err;
campSchema.Partner.update(
{ "products": req.body.productId },
{ "$pull": { "products": req.body.productId } },
function (err, res){
if (err) throw err;
var campaignList = product.campaign
campSchema.Campaign.remove({ "_id": { "$in": campaignList } })
.exec(function (err, res){
if (err) throw err;
res.json(product);
})
}
);
}
);
});
हालांकि यह काम करता है, async/await या async का उपयोग करके उपरोक्त संभावित नुकसान से बचा जा सकता है
पुस्तकालय। लेकिन सबसे पहले, आपको asyncके साथ एकाधिक कॉलबैक का उपयोग करने की बेहतर समझ प्रदान करने के लिए कोड>
मॉड्यूल, आइए इसे सेवन के उदाहरण से स्पष्ट करते हैं वे चीज़ें जिन्हें आपको Node.js के साथ करना बंद कर देना चाहिए
एक पैरेंट इकाई को खोजने के लिए कॉलबैक के साथ कई ऑपरेशन, फिर माता-पिता से संबंधित चाइल्ड इकाइयाँ खोजें:
methodA(function(a){
methodB(function(b){
methodC(function(c){
methodD(function(d){
// Final callback code
})
})
})
})
async/प्रतीक्षा के साथ, आपकी कॉलों को
. के रूप में संरचित किया जाएगाrouter.post('/removeProduct', async (req, res) => {
try {
const product = await campSchema.Product.findOneAndRemove(
{ _id: req.body.productId },
{ new: true }
)
await campSchema.Partner.update(
{ "products": req.body.productId },
{ "$pull": { "products": req.body.productId } }
)
await campSchema.Campaign.remove({ "_id": { "$in": product.campaign } })
res.json(product)
} catch(err) {
throw err
}
})
async मॉड्यूल के साथ, आप या तो कई विधियों के नेस्टिंग कोड के लिए कॉलबैक के उपयोग को संबोधित करने के लिए श्रृंखला पद्धति का उपयोग कर सकते हैं जिसके परिणामस्वरूप कॉलबैक हेल :
श्रृंखला :
async.series([
function(callback){
// code a
callback(null, 'a')
},
function(callback){
// code b
callback(null, 'b')
},
function(callback){
// code c
callback(null, 'c')
},
function(callback){
// code d
callback(null, 'd')
}],
// optional callback
function(err, results){
// results is ['a', 'b', 'c', 'd']
// final callback code
}
)
या झरना :
async.waterfall([
function(callback){
// code a
callback(null, 'a', 'b')
},
function(arg1, arg2, callback){
// arg1 is equals 'a' and arg2 is 'b'
// Code c
callback(null, 'c')
},
function(arg1, callback){
// arg1 is 'c'
// code d
callback(null, 'd');
}], function (err, result) {
// result is 'd'
}
)
अब अपने कोड पर वापस जा रहे हैं, एसिंक वॉटरफॉल विधि का उपयोग करके आप अपने कोड को
. में पुनर्गठित कर सकते हैंrouter.post('/removeProduct', function (req, res) {
async.waterfall([
function (callback) {
// code a: Remove Product
campSchema.Product.findOneAndRemove(
{ _id: req.body.productId },
function (err, product) {
if (err) callback(err);
callback(null, product);
}
);
},
function (doc, callback) {
// code b: Remove associated campaigns
var campaignList = doc.campaign;
campSchema.Campaign
.remove({ "_id": { "$in": campaignList } })
.exec(function (err, res) {
if (err) callback(err);
callback(null, doc);
}
);
},
function (doc, callback) {
// code c: Remove related partner
campSchema.Partner.update(
{ "products": doc._id },
{ "$pull": { "products": doc._id } },
function (err, res) {
if (err) callback(err);
callback(null, doc);
}
);
}
], function (err, result) {
if (err) throw err;
res.json(result); // OUTPUT OK
});
});