Member 14081431 Ответов: 1

Мангуст порядок методов


Я пытаюсь создать новый объект и сохранить его в базе данных, а затем найти все объекты из базы данных и распечатать их . но здесь он сначала запускает метод find (), даже если я вызываю метод find() после create(). может ли кто-нибудь объяснить, почему это так?

вот мой код :

Cat.create({
    name : "Billy",
    age : 10,
    breed : "Turkish Van"
}, function(err,cat){
    if(err)
        {
            console.log("Oh Error!!");
        }else
            {
                console.log("Great!!");
                console.log(cat); 
                console.log("==========================================");
            }
});

Cat.find({},function(err,cats){
    if(err){
        console.log("Oh Error!!");
    }else {
        console.log("All the cats !!! ");
        console.log(cats);
    }
});


Что я уже пробовал:

я попробовал создать новую кошку мимо
var newC=new Cat({
 	name :"Tommy",
 	age : 10,
 	breed: "Persian"
 });

 newC.save(function(err,cat){}


тем не менее в консоли он сначала запускает метод find (), а затем метод create (). может кто-нибудь объяснить почему.
Заранее спасибо.

1 Ответов

Рейтинг:
1

Richard Deeming

То творить[^] метод возвращает a обещать.

Это означает, что метод возвращает до вставка завершена. Он возвращает объект, который будет разрешен после завершения операции.

Если вы хотите что-то запустить после завершения вставки, у вас есть несколько вариантов:

Обратный звонок:
Переместите вторую операцию в функцию обратного вызова:

Cat.create({
    name : "Billy",
    age : 10,
    breed : "Turkish Van"
}, function(err,cat){
    if(err) {
        console.log("Oh Error!!");
    } else {
        console.log("Great!!");
        console.log(cat); 
        console.log("==========================================");
    }
    
    Cat.find({},function(err,cats){
        if(err) {
            console.log("Oh Error!!");
        } else {
            console.log("All the cats !!! ");
            console.log(cats);
        }
    });
});

Используйте "тогда":
Вызовите вторую операцию из меню .then обратный звонок:
Cat.create({
    name : "Billy",
    age : 10,
    breed : "Turkish Van"
}, function(err,cat){
    if(err) {
        console.log("Oh Error!!");
    } else {
        console.log("Great!!");
        console.log(cat); 
        console.log("==========================================");
    }
}).then(function(){
    Cat.find({}, function(err, cats){
        if(err) {
            console.log("Oh Error!!");
        } else {
            console.log("All the cats !!! ");
            console.log(cats);
        }
    });
});

Воспользуйся async/await:
Измените свой код для использования async / await:
async function makeACat() {
    try {
        const cat = await Cat.create({
            name : "Billy",
            age : 10,
            breed : "Turkish Van"
        });
        
        console.log("Great!!");
        console.log(cat); 
        console.log("==========================================");
    }
    catch (error) {
        console.error("Oh Error!!", error);
    }
    
    try {
        const cats = await Cat.find({});
        console.log("All the cats !!! ");
        console.log(cats);
    }
    catch (error) {
        console.error("Oh Error!!", error);
    }
}
Руководство 80/20 по Async/Await in Node.js | www.thecodebarbarian.com[^]


Member 14081431

@Ричард его, показывая ошибку как :

}).затем(функция(){
^

TypeError: не удается прочитать свойство 'then' undefined

Richard Deeming

Это странно. Вы используете действительно старую версию? Похоже, что поддержка "обещания", возможно, была добавлена в v5.