Присвоение результата обещания переменной в nodejs - PullRequest
0 голосов
/ 24 января 2020
let data =  users.find({})
                    .toArray()
                    .then((result) => {
                    state.response.end(JSON.stringify({
                            message: result
                        }));
                    })
                    .catch((err) => {
                        state.response.end(JSON.stringify({
                            error:  err.message,
                        }));
                        log.error(failed to process the request: ", err);
                    });


if(!!data){

return collage.find({_id: params._id}).toArray()
                    .then((collages: any[]) => {
                        if (!!collages) {
                            return //some more code
                        }
                    })
                    .then(() => {
                        return university.find({_id: params._id}).toArray()
                    })
                    .then((user: any[]) => {
                        if (!!user) {
                            return   //some more code
                        }
                    })
                    .then(() => {
                        response.writeHead(200, {'Content-Type': 'application/json'});
                        response.end(JSON.stringify({status: " Request processed."}));
                    })
                    .catch((err) => {
                       response.writeHead(200, {'Content-Type': 'application/json'});
                        response.end(JSON.stringify({status: "error",  + err.message}));
                    });


}

возвращает результат всех обещаний сразу как

return {
collage:collages,
university:users
}

Здесь я выбираю данные из нескольких коллекций, используя обещание (без asyn c и ожидание). я хочу сначала получить данные из пользовательских коллекций, а затем из других коллекций. код внутри, если условие возвращается первым, не дожидаясь результатов сборов пользователей. это написать способ сделать это? или

Ответы [ 2 ]

1 голос
/ 24 января 2020

Я думаю, что вы новичок в Nodejs, неважно, прежде чем приступить к кодированию, вы должны понять синхронный код против асинхронного кода. Ваш код не выполняется синхронно. Прочитайте это:

https://codeforgeek.com/asynchronous-programming-in-node-js/

https://javascript.info/async

Кроме того, изучите обратные вызовы, обещания и асинхронность c -wait

Примечание: Я не проверяю логи c Здесь я просто направляю вас с потоком, Пожалуйста, проверьте все условия самостоятельно

Вы можете используйте async-await

    try {
    let data = await users.find({}).toArray()

    if(check proper condition here){
      let collages = await collage.find({_id: params._id}).toArray()
      so and so.....
    }
   catch(err) {

   }

============================== Использование обещаний ===== =====================

 let final_result =  {};
 users.find({}).toArray()
                .then((result) => {
                 let data = result;
                  state.response.end(JSON.stringify({
                        message: result
                    }));
                  if(check for condition)
                   return collage.find({_id: params._id}).toArray();
                }).then(function(collages){

                   final_result.collages = collages;
                    return university.find({_id: params._id}).toArray()

                 }).then((users) => {
                  final_result.users= users
                  so and so ......

                }).catch((err) => {
                    state.response.end(JSON.stringify({
                        error:  err.message,
                    }));
                    log.error(failed to process the request: ", err);
                });
0 голосов
/ 24 января 2020

data не определяется при повторном доступе к нему. Вот как работает асинхронный код, есть руководство по нему , если вы не знакомы с концепцией, но в основном .toArray() - это обещание, которое разрешается до значения , это не так значение .

Вот что вы можете сделать:

// using .then
users.find({}).toArray().then(data => {
  // data is defined, do something with it
});

// using async/await
const data = await users.find({}).toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...