2017-09-27 26 views
5

Node.js. async/await işlevsellik ile Mongoose promises kullanarak asmak çalışıyorum. printEmployees işlevim çağrıldığında, orderEmployees işlevi tarafından sorgulanan çalışanların listesini kaydetmek istiyorum. orderEmployees içindeki console.log ifadesi, beklenen sorguyu döndürürken, printEmployees'un içindeki console.log, undefined değerini döndürür; bu, söz vermeyi doğru bir şekilde döndürmediğimi gösterir.Async/await ile mongoose sözlerini kullanarak

Paradigmayı tam olarak anlayamadığım kadar çok söz veriyorum yeniyim ... herhangi bir yardım çok takdir ediliyor.

printEmployees: async(company) => { 
    var employees = await self.orderEmployees(company); 
    // SECOND CONSOLE.LOG 
    console.log(employees); 
    }, 

    orderEmployees: (companyID) => { 
    User.find({company:companyID}) 
    .exec() 
    .then((employees) => { 
     // FIRST CONSOLE.LOG 
     console.log(employees); 
     return employees; 
    }) 
    .catch((err) => { 
     return 'error occured'; 
    }); 
    }, 

cevap

3

aksi takdirde await esasen hiçbir şey/undefined döndüren bir fonksiyon üzerindeki ing vardır, sizin Promisereturn gerekir.

orderEmployees: (companyID) => { 
    return User.find({ company:companyID }).exec() 
} 
2

Sen dönmek gereken Promise

orderEmployees: companyId => User.find({ companyId }).exec() 

onu olduğu gibi daha sonra dönmeden önce kodunuzu tutabilir bazı hata işleme veya ön işlem yapmak ama sadece dönmek hatırlamak istiyorsanız orderEmployees dan sonuç (sözler zincirlenebilir).

+0

[Açık söz yaratma antipatternini] nasıl göremiyorum (https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid -it) hata işleme ile yardımcı olur. Fayda nedir? Basit bir async fonksiyonundan sadece çalışanlarınızı ve “e” komutlarını geri gönderebilirsiniz. –

+0

@TamasHegedus evet, iyi bir nokta, Node'un iç vaatlerden iyi istisnalar atmadığı zamanlarda eski alışkanlık! – James

4

Bir Sözü siparişten iade etmiyorsunuz. zaman uyumsuz işlevler gibi orderEmployees davranacaksan hale getirmek için

printEmployees: async(company) => { 
    var employees = await self.orderEmployees(company); 
    // SECOND CONSOLE.LOG 
    console.log(employees); 
}, 

orderEmployees: (companyID) => { 
    return User.find({company:companyID}) 
.exec() 
.then((employees) => { 
    // FIRST CONSOLE.LOG 
    console.log(employees); 
    return employees; 
}) 
.catch((err) => { 
    return 'error occured'; 
}); 
}, 
6

, elde edilen söz dönmek zorunda.

  1. (bir zaman uyumsuz işlevi tarafından döndürülen örneğin) ya .then çağırmalıdır bir söz varsa o Promise
  2. dönerse bir fonksiyon eşzamansızsa: sözlerini kullanırken async/await anahtar kelimeler olmadan takip etmek iki kural var üstünde ya da iade et.

o zaman sözleriawait edinmeniz gerekir async/await kullanıyor.

Bu, orderEmployees içinde oluşturulan sözü vermediğinizi fark edeceksiniz. Düzeltmek kolay, ama aynı zamanda bu işlevi tekrar uyumsuzluk tekrar yazmak.

orderEmployees: (companyID) => { 
    return User.find({company:companyID}) // Notice the return here 
    .exec() 
    .then((employees) => { 
    // FIRST CONSOLE.LOG 
    console.log(employees); 
    return employees; 
    }) 
    .catch((err) => { 
    return 'error occured'; 
    }); 
}, 

veya

orderEmployees: async(companyID) => { 
    try { 
    const employees = await User.find({company:companyID}).exec(); 
    console.log(employees); 
    return employees; 
    } catch (err) { 
    return 'error occured'; 
    } 
}, 

Not: hata işleme biraz burada kusurlu. Genellikle bir hata dizesini bir işlevden döndürerek hataları işlemeziz. Bu durumda hata propagandası yapmak ve bazı üst düzey UI kodlarından ele almak daha iyidir.