MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongoose chuyển dữ liệu ra khỏi withTransaction helper

Có vẻ như có một số nhầm lẫn ở đây về cách sử dụng chính xác Promises, ở một số cấp độ.

Callback và Promise đang được sử dụng không đúng cách

Nếu hàm phải chấp nhận một cuộc gọi lại, đừng trả về một Lời hứa. Nếu hàm được cho là trả về một Lời hứa, hãy sử dụng lệnh gọi lại được đưa ra bởi Lời hứa:

const transactionSession = await mongoose.startSession()
await transactionSession.withTransaction( (tSession) => {
    return new Promise( (resolve, reject) => {
        //using Node-style callback
        doSomethingAsync( (err, testData) => {
            if(err) {
                reject(err);
            } else {
                resolve(testData); //this is the equivalent of cb(null, "Any test data")
            }
        });
    })

Hãy xem xét điều này chi tiết hơn:

return new Promise( (resolve, reject) => { Điều này tạo ra một Lời hứa mới và Lời hứa sẽ cung cấp cho bạn hai lệnh gọi lại để sử dụng. resolve là một cuộc gọi lại để biểu thị sự thành công. Bạn chuyển nó cho đối tượng bạn muốn trả lại. Lưu ý rằng tôi đã xóa async từ khóa (thêm về điều này sau).

Ví dụ:

const a = new Promise( (resolve, reject) => resolve(5) );
a.then( (result) => result == 5 ); //true

(err, testData) => { Hàm này được sử dụng để ánh xạ Node-style cb(err, result) đối với lệnh gọi lại của Promise.

Thử / bắt đang được sử dụng không chính xác.

Thử / bắt chỉ có thể được sử dụng cho các câu lệnh đồng bộ. Hãy so sánh một lệnh gọi đồng bộ, một kiểu Node (tức là cb(err, result) ) gọi lại không đồng bộ, một Lời hứa và sử dụng await:

  • Đồng bộ:
try {
    let a = doSomethingSync();
} catch(err) {
    handle(err);
}
  • Không đồng bộ:
doSomethingAsync( (err, result) => {
    if (err) {
        handle(err);
    } else {
        let a = result;
    }
});
  • Lời hứa:
doSomethingPromisified()
    .then( (result) => { 
        let a = result; 
    })
    .catch( (err) => {
        handle(err);
    });
  • Chờ đợi. Await có thể được sử dụng với bất kỳ hàm nào trả về Promise và cho phép bạn xử lý mã như thể nó đồng bộ:
try {
    let a = await doSomethingPromisified();
} catch(err) {
    handle(err);
}

Thông tin bổ sung

Promise.resolve()

Promise.resolve() tạo một Lời hứa mới và giải quyết Lời hứa đó với một giá trị không xác định. Đây là cách viết tắt của:

new Promise( (resolve, reject) => resolve(undefined) );

Tương đương với lệnh gọi lại này sẽ là:

cb(err, undefined);

async

async đi cùng với await . Nếu bạn đang sử dụng await trong một hàm, hàm đó phải được khai báo là async .

Cũng giống như await mở ra một Lời hứa (resolve thành một giá trị và reject thành một ngoại lệ), async kết thúc mã thành một Lời hứa. Một return value câu lệnh được dịch sang Promise.resolve(value) và một ngoại lệ được ném ra throw e được dịch sang Promise.reject(e) .

Hãy xem xét đoạn mã sau

async () => {
    return doSomethingSync();
}

Đoạn mã trên tương đương với đoạn mã này:

() => {
    const p = new Promise(resolve, reject);
    try {
        const value = doSomethingSync();
        p.resolve(value);
    } catch(e) {
        p.reject(e);
    }
    return p;
}

Nếu bạn gọi một trong các hàm trên mà không có await , bạn sẽ nhận lại được một Lời hứa. Nếu bạn await một trong hai giá trị đó, bạn sẽ được trả về một giá trị hoặc một ngoại lệ sẽ được đưa ra.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb cài đặt - yêu cầu?

  2. ánh xạ trường id mongodb dữ liệu mùa xuân

  3. Có ai biết một ví dụ làm việc của chỉ mục 2dsphere trong pymongo không?

  4. Tên bộ sưu tập động Nodejs mongodb

  5. Gọi hàm được lưu trữ Mongodb từ PHP7