【问题标题】:Can't return data from callback function at NodeJS无法从 NodeJS 的回调函数返回数据
【发布时间】:2019-05-17 07:33:15
【问题描述】:

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

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 未定义! ....

【问题讨论】:

  • console.log(s);会在给var s赋值后立即执行,函数在find查询后返回值,所以初始值为undefined,需要等到它返回打印值。你不能像上面那样分配它..
  • 我该怎么办?...请举例.... :(
  • 你需要学习 Async / Await 或 Promises 来弄清楚为什么你的所作所为永远行不通。总帐。

标签: node.js


【解决方案1】:

您混淆了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
  }
});

【讨论】:

  • @AungHtetPaing 我已经编辑了我的帖子,以便您了解下一步该去哪里
【解决方案2】:

我认为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 一起工作,所以我将它放入异步函数中。

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2015-04-21
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多