وعود التعشيش مع النمس
سؤال
لدي وعد بأنني سأستخدمه للقيام بمعالجة قاعدة البيانات مع النمس.باستخدام مكتبة mpromise، أنا آخذ teamMatch
واستخدامه لتحديث Team
وثيقة.ومع ذلك، فإن البرنامج لا يفعل أي شيء يتجاوز السطر الذي أقوم فيه بتحديث الملف Team
(ابدأ بـ var getTeamPromise).
كيف يمكنني تغيير هذا الرمز حتى أتمكن من القيام بما وصفته أعلاه بسهولة أكبر؟
saveTeamMatch.then(
function saveTeamMatchToTeam(teamMatch) {
console.log('TEAM_MATCH in SAVE to TEAM', teamMatch); //works
// when a team is gotten and a teamMatch is made and saved
// save the teamMatch to the team
var getTeamPromise = Team.findOneAndUpdate( { id:1540 }, { $push:{ matches:teamMatch } } ).exec()
.then(
function successfullySaveTeamMatchToTeam(team) {
console.log('TEAM in SUCCESSFUL SAVE', team);
getTeamPromise.resolve();
},
function failToUpdateTeam(err) {
console.error( err );
getTeamPromise.resolve();
}
)
.resolve(
function endFindMatchPromise() {
saveTeamMatch.end();
}
);
},
function failToSaveTeamMatch(err) {
console.error(err);
saveTeamMatch.end();
}
);
المحلول
يبدو أنك أخطأت في فهم بعض الأشياء المتعلقة بالوعود:
منح getTeamPromise.then(onResolve, onReject)
:
- في onResolve وonReject، تم حل/رفض الوعد بالفعل، وبالتالي لا يمكنك تغيير حالته عن طريق استدعاء العزم على نفس الوعد
- يجب أن يكون تصميمك (function()) هو النتيجة المعالجة من نتيجة الأول
- في العادة، لا ينبغي عليك التلاعب بحالة الوعود، والكثير من الأساليب التي تستدعيها هي طرق داخلية لإنشاء الوعود والوفاء بها.
- سيؤدي إرجاع الوعد من معالج onResolve إلى توجيه هذا الوعد أو القيمة إلى الوعد التالي
then
اسمحوا لي أن أكتب هذا بطريقة - ربما - عملية:
saveTeamMatch.then(function saveTeamMatchToTeam(teamMatch) {
console.log('TEAM_MATCH in SAVE to TEAM', teamMatch); //works
// when a team is gotten and a teamMatch is made and saved
// save the teamMatch to the team
return Team
.findOneAndUpdate({id:1540}, {$push:{matches:teamMatch}}).exec()
.then(function successfullySaveTeamMatchToTeam(team) {
console.log('TEAM in SUCCESSFUL SAVE', team);
return team;
}, function failToUpdateTeam(err) {
console.error('failedToUpdateTeam', err);
});
},function failToSaveTeamMatch(err) {
console.error('saveTeamMatch failed', err);
})
.end();
لا تنتمي إلى StackOverflow