Как работает управление внутри этой функции? - PullRequest
0 голосов
/ 26 апреля 2019

Мне нужно написать функцию, которая ищет объект с помощью _id в mongodb, и внутри этого объекта он найдет другой массив идентификаторов из другой коллекции, а затем найдет имена из другой коллекции, используя этот массив идентификаторов.

Вместо того, чтобы идти к большему количеству циклов, я напрямую попытался получить доступ с помощью индекса.

Order.findById(orderId)
        .then(order => {
            if(!order){
                    console.log('No Order');
                return next(new Error('No Order Found'));
            }
            console.log(order.productId[0]);
            console.log('reached here 1');
            Product.findById(order.productId[0])
                .then( product => {
                    if(!product){
                        return res.redirect('/admin/create-subadmin');
                    }
                    console.log('inside FindById');
                    const ProductName1 = product.name;
                    console.log(ProductName1);
            })
            .catch(err => console.log(err));        
            console.log('reached here');

         })
         .catch(err => {
             console.log(err);
         });

Токовый выход:

5cb9e18d6c17f41bacbcdf55 //(id of product[0])
reached here 1 
reached here 
inside FindById 
Titleasd   //(name of of product[0])

Я не могу понять, почему это происходит внутри Product.findById в прошлом.т.е. console.log («достигнуто здесь»);// выполнение этой строки выполняется до Product.findById

Scheme of Order
{
    _id: mongoose.Schema.Types.ObjectId,
    orderId:String,
    productId:Array

}
Schema of Product
{

    product_id: {type: Schema.Types.ObjectId,
    },
    title: String,
    name:{
        type: String,
        unique: true,
        required: true
    },
    price:Number
}

Я ожидаю, что функция войдет внутрь Order -> перейти к массиву productId -> Используя эти идентификаторы, найдите все названия продуктов ицена и хранить их в объекте или массиве что-нибудь, но я даже не могу понять поток управления прямо сейчас.

1 Ответ

0 голосов
/ 26 апреля 2019

Так что о потоке, одна вещь, которую вы пропустили. Product.findById является асинхронным. Поэтому, когда вы вызываете ее, текущая функция не остановится и не выполнит следующую строку, которая console.log('reached here');.

Посмотрите на следующий пример, чтобы понять:

Это ваш случай

function promise() {
  return new Promise((resolve) => {
    console.log('#1 Start promise function execution');

    setTimeout(() => {
      console.log('#2 Finish promise function execution');

      resolve();
    }, 1500);
  });
}

function test() {
  return new Promise((resolve) => {
    promise()
      .then(() => {
        console.log('#3 After the promise function call');
      })
      .then(resolve);

    console.log('#4 End of all');
  });
}

test();

Это решение

function promise() {
  return new Promise((resolve) => {
    console.log('#1 Start promise function execution');

    setTimeout(() => {
      console.log('#2 Finish promise function execution');

      resolve();
    }, 1500);
  });
}

function test() {
  return new Promise((resolve) => {
    promise()
      .then(() => {
        console.log('#3 After the promise function call');
      })
      .then(() => {
        console.log('#4 End of all');
        
        resolve();
      });
  });
}

test();


Так как насчет вашего кода? Вы можете связать звонки

Order.findById(orderId)
  .then((order) => {
    if (!order) {
      console.log('No Order');

      return next(new Error('No Order Found'));
    }

    console.log(order.productId[0]);
    console.log('reached here 1');

    return Product.findById(order.productId[0]);
  })
  .then((product) => {
    if (!product) {
      return res.redirect('/admin/create-subadmin');
    }

    console.log('inside FindById');

    const ProductName1 = product.name;

    console.log(ProductName1);
  })
  .then(() => {
    console.log('reached here');
  })
  .catch(err => {
    console.log(err);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...