无法从NodeJS的回调函数返回数据

时间:2019-05-17 07:33:16

标签: node.js

当我创建新变量并分配回调函数时,但是数据无法从回调函数返回。未定义发生在新变量。

const nedb = require('nedb');
const user = new nedb({ filename: './builds/database/users.db', autoload: true });
var s = user.find({}, function (err,docs) {
  if(docs.length == 0) {
    var data = false;
  } else {
    var data = docs;
  }
  return data;
});
console.log(s);

var s未定义! ....

2 个答案:

答案 0 :(得分:3)

您正在混淆callbackPromise,这是处理异步调用的两种不同方式。

我建议您使用Promises,因为它们更简单,而且是javascript的现在和将来。


使用async / await,这是Promises之后的下一步

const user = {
 find: () => ['jon', 'kalessi', 'jorah'],
};

async function getUsers() {
  return (await user.find({})) || [];
}

async function myJob() {
  const users = await getUsers();
  
  console.log(users);

  // Put your next code here
}

myJob();


完全承诺:

const user = {
  find: () => new Promise((resolve) => resolve(['jon', 'kalessi', 'jorah'])),
};

user.find({})
  .then((docs = []) => {
    console.log(docs);

    // Put you next code here, you can use of the variable docs
  })
  .catch((err) => {
    console.log(err);
  });


完整回调:

const user = {
  find: (_, callback) => callback(false, ['jon', 'kalessi', 'jorah']),
};

user.find({}, (err, docs = []) => {
  if (err) {
    console.log(err);
  } else {
    console.log(docs);

    // Put you next code here, you can use of the variable docs
  }
});

答案 1 :(得分:0)

我认为user.find兑现了承诺。你可以这样做。

const nedb = require('nedb');
const user = new nedb({ filename: './builds/database/users.db', autoload: true });
var s = user.find({}, function (err,docs) {
  if(docs.length == 0) {
    var data = false;
  } else {
    var data = docs;
  }
  return data;
});

Promise.all(s)
.then(result => {
   console.log(result);
});

否则,您也可以像这样使用await

async function abc(){
    const nedb = require('nedb');
        const user = new nedb({ filename: './builds/database/users.db', autoload: true });
    var s = await user.find({}, function (err,docs) {
      if(docs.length == 0) {
        var data = false;
      } else {
        var data = docs;
      }
      return data;
    });
}

因为awaitasync一起工作,这就是为什么我将其放入异步功能。