2017-09-27 24 views
5

Tôi đang cố gắng sử dụng Mongoose với chức năng async/await của Node.js. Khi chức năng của tôi printEmployees được gọi là tôi muốn lưu danh sách nhân viên được truy vấn bởi chức năng orderEmployees. Trong khi, tuyên bố console.log bên trong orderEmployees trả về truy vấn mong đợi, console.log bên trong của printEmployees trả về undefined, cho thấy rằng tôi không trả lời đúng.Sử dụng mongoose hứa hẹn với async/await

Tôi mới hứa hẹn hoàn toàn có thể là tôi không hiểu chính xác mô hình ... bất kỳ trợ giúp nào được đánh giá cao.

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'; 
    }); 
    }, 

Trả lời

3

Bạn cần phải returnPromise của bạn, nếu bạn là await ing vào một chức năng mà chủ yếu trả về không có gì/undefined.

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

Bạn cần phải trả lại một Promise từ orderEmployees

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

Nếu bạn muốn làm một số xử lý lỗi hoặc tiền xử lý trước khi bạn quay trở lại sau đó bạn có thể giữ mã của bạn như là nhưng chỉ cần nhớ để trở lại kết quả (lời hứa là có thể thay đổi được).

+0

Tôi không thấy cách [antipattern tạo lời hứa rõ ràng] (https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid -it) sẽ giúp xử lý lỗi. Lợi ích là gì? Bạn chỉ có thể 'trả về nhân viên' và' ném e' từ một hàm async đơn giản. –

+0

@TamasHegedus vâng điểm tốt, thói quen cũ từ những lần mà Node không xử lý ném ngoại lệ tốt từ những lời hứa bên trong! – James

4

Bạn không trả lại Lời hứa từ orderEmployees.

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

Để thực hiện orderEmployees hoạt động như chức năng không đồng bộ, bạn phải trả lại lời hứa kết quả. Có hai quy tắc để làm theo khi sử dụng những lời hứa mà không async/await từ khóa:

  1. Một chức năng là không đồng bộ nếu nó trả về một Promise
  2. Nếu bạn có một lời hứa (ví dụ trả về bởi một hàm async), bạn phải hoặc gọi .then trên đó hoặc trả lại.

Khi bạn đang sử dụng async/await sau đó bạn phảiawait lời hứa bạn có được.

Điều này cho biết bạn sẽ nhận thấy rằng bạn không trả lại lời hứa được tạo bên trong orderEmployees. Dễ sửa, nhưng cũng dễ dàng viết lại hàm đó thành không đồng bộ.

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'; 
    }); 
}, 

hoặc

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

PS: việc xử lý lỗi có phần thiếu sót ở đây. Chúng tôi thường không xử lý lỗi bằng cách trả về một chuỗi lỗi từ một hàm. Tốt hơn là để truyền lỗi trong trường hợp này và xử lý nó từ một số mã UI cấp cao nhất.

Các vấn đề liên quan