【问题标题】:JavaScript out of scope undefined [duplicate]JavaScript超出范围未定义[重复]
【发布时间】:2018-01-28 22:58:00
【问题描述】:
var http = require('http');
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/testdb";

var companies = [{'name' : 'Sun Pharma', 'medicine' : [1, 2]},
                {'name' : 'Hello Pharma', 'medicine' : [3, 4]},
                {'name' : 'Sayan Pharma Ltd.', 'medicine' : [5]}]

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  var companyCollection = db.collection ('company');
  companies.forEach ((company) => {
    companyCollection.insert (company);
  });
  var out;
  companyCollection.find({}).toArray(function (err, result) {
    if (err) {
      console.log (err);
    } else if (result.length) {
      console.log (result); // Prints correct array
      out = result;
      console.log (out); // Prints correct array
    } else {
      console.log ('No documents found');
    }
    db.close();
  });
  console.log (out); // Prints undefined
});

变量 out 的赋值等于结果。当 resultout 在函数范围内打印时,它会正确打印,但是当我在函数外打印 out 时,它是未定义的。为什么会发生这种情况以及如何解决?

【问题讨论】:

  • 这就是我们使用回调的原因!
  • 你确定最后一行打印的是 undefined,而不是 []
  • 我们如何使用回调?你能帮忙吗?

标签: javascript node.js function scope functional-programming


【解决方案1】:
  var out = [];  // 1.
  companyCollection.find({}).toArray(function (err, result) {
    if (err) {
      console.log (err);
    } else if (result.length) {
      console.log (result); // 3. asynchronous code in callback
      out = result;
      console.log (out); // 4. asynchronous code in callback
    } else {
      console.log ('No documents found');
    }
    db.close();
  });
  console.log (out); // 2. synchronious code

【讨论】:

  • 然后呢?为什么out 未定义?
  • 要修复它,您应该在回调中使用out 进行一些操作
猜你喜欢
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2020-04-21
相关资源
最近更新 更多