【问题标题】:Assigning a promise result to a variable in nodejs将承诺结果分配给nodejs中的变量
【发布时间】:2020-05-10 22:01:24
【问题描述】:
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}));
                    });


}

一次性返回所有的 promise 结果

return {
collage:collages,
university:users
}

在这里,我使用 Promise(无异步和等待)从多个集合中获取数据。我想先从用户集合中检索数据,然后再从其他集合中检索数据。如果条件首先返回而不等待用户收集结果,则内部代码。是这样写的吗?还是?

【问题讨论】:

  • 为什么不能使用 async/await?
  • 请用未声明的变量是什么来完成您的问题。

标签: node.js typescript promise


【解决方案1】:

我认为你是 Nodejs 的新手没关系,在开始编码之前,你应该了解同步代码与异步代码。您的代码没有同步执行。读出来:

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

https://javascript.info/async

另外,学习回调、promise 和 async-await

注意:这里我不是在检查逻辑,我只是​​在指导你的流程,请自行检查所有条件

你可以使用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) {

   }

===============================使用 Promises=============== ===========

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

【讨论】:

  • 没有异步等待有什么办法吗?
  • 你可以链接承诺
  • 然后我必须自定义输出我想在最后结合两个表格结果并返回像`return {table1:collage,table2:universities}`
【解决方案2】:

data 在您第二次访问时未定义。这就是异步代码的工作原理,如果您不熟悉这个概念,可以使用a guide on it,但基本上.toArray() 是一个解析为值的承诺,它不是一个值。

你可以这样做:

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

// using async/await
const data = await users.find({}).toArray();

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 2019-09-18
    • 2020-04-30
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多