提问者:小点点

如何从异步函数中获取数据,获取数据后允许执行下一个代码


我使用mongoose find()从mongodb获得了一些数据,并对数据执行了一些验证,但问题是这个函数是异步,它不等待数据完成并执行下一段代码。并且当执行下一个代码时,由于它具有空数据,所以它能够执行。然后,我在异步函数中编写了验证逻辑,这样当数据可用时,它才会移动到下一个代码,但每次返回时,它都会发送未定义的数据。

function isValidObject(obj) {

     schemaData.find({}, (error, data) => { // calls data from db

      var contactSchema = data; // this is data i need

    if(//validation fails){
      return "wrong data";// every time it returns undrfined on every 
                          // condition
     }

     });                         
 }

var validationResp = isValidObject(obj);
console.log(validationResp); // output is undefined

我还使用“await”来等待数据,但在这种情况下,它在每个return语句上返回[object promise]


共3个答案

匿名用户

使用Async/Await

在你的情况下:

async function isValidObject(obj) {
  let data = await schemaData.find({}); // wait until it resolve promise 
  //do your validaion    
  return data;                  
}

isValidObject(obj).then((validationResp)=>{console.log(validationResp)});

匿名用户

使用then()方法返回一个承诺

var promise1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});

promise1.then(function(value) {
  console.log(value);
  // expected output: "Success!"
});

使用then方法的MDN中的更多详细信息

匿名用户

你熟悉“承诺。你可以使用”。then(callback)“。它将等待直到执行异步函数。并且可以在回调函数中执行验证

 User.findById(id)
    .then(function(user) {
      if (!user) {
        return "here you return an error";
      }

      return "you return OK with payload from database";
    })
    .catch(next);