最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

MongoConnect传递客户为回调

IT培训 admin 5浏览 0评论

MongoConnect传递客户为回调

我很困惑,这里的回调。我们返回客户端的承诺,但我们如何执行,在回调?如果客户对象是回调那么是不是在客户端调用客户端?什么是相当于回调?

const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;

const mongoConnect = callback => {
  MongoClient.connect(
    'mongodb+srv://<user>:<password>@cluster0-ntrwp.mongodb/test?retryWrites=true'
  )
    .then(client => {
      console.log('Connected!');
      callback(client);
    })
    .catch(err => {
      console.log(err);
    });
};

module.exports = mongoConnect;


(app.js)
mongoConnect(client => {
  console.log(client);
  app.listen(3000);
});

这不是预期的输出。我有点困惑这里的回调。

const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;

const mongoConnect = client => {
      console.log(client);
      app.listen(3000); => {
  MongoClient.connect(
    'mongodb+srv://<user>:<password>@cluster0-ntrwp.mongodb/test?retryWrites=true'
  )
    .then(client => {
      console.log('Connected!');
      client => {
        console.log(client);
        app.listen(3000);(client);
    })
    .catch(err => {
      console.log(err);
    });
};

module.exports = mongoConnect;


(app.js)
mongoConnect(client => {
  console.log(client);
  app.listen(3000);
});
回答如下:

我猜你问的第一个代码是如何工作的。我重写了第一代码使用旧学校function()代替ES6脂肪箭头,并把一些日志记录,以使其更清晰这是怎么回事:

const express = require('express');
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
const app = express();

function mongoConnect(callback) {
  MongoClient.connect('mongodb://localhost:27017')
    .then(client => {
      console.log('[mongoConnect] Connected!');
      console.log('[mongoConnect] callback type: ' + typeof(callback));
      console.log('[mongoConnect] client type: ' + typeof(client));
      console.log('[mongoConnect] client is: ' + client.constructor.name);
      callback(client);
    })
    .catch(err => {
      console.log(err);
    });
};

mongoConnect(function(client) {
  console.log('[main] client type: ' + typeof(client));
  console.log('[main] client is: ' + client.constructor.name);
  app.listen(3000, function() {
    console.log('[main] listening on 3000');
  });
});

运行代码:

[mongoConnect] Connected!
[mongoConnect] callback type: function
[mongoConnect] client type: object
[mongoConnect] client is: MongoClient
[main] client type: object
[main] client is: MongoClient
[main] listening on 3000

至于你的问题:

如果客户对象是回调那么是不是在客户端调用客户端?什么是相当于回调?

为了解开这是怎么回事:

  • client是一个对象,并且callback是一个函数。
  • mongoConnect()接受一个函数作为参数。
  • 获取传递到mongoConnect()该函数接受client(一个对象)作为参数。从技术上讲,这是没有必要的。我想这是只有在那里审计/日志记录。您可以删除所有提到的那部分代码client的,并认为它仍然有效。

例如,你可以改变的代码位是:

mongoConnect(function() {
  app.listen(3000, function() {
    console.log('[main] listening on 3000');
  });
});

它仍然会工作方式相同。

执行顺序是:

  1. mongoConnect(function(client))被称为
  2. 里面mongoConnectMongoClient.connect()被称为
  3. 一旦连接,回调(function(client))被称为
  4. 回调执行app.listen()

这个流程顺序保证了应用进入侦听模式前的数据库连接。不这样做,被确认之前的任何数据库连接(例如,由于比预期的数据库连接等更慢)的应用可以听。您可以确认通过观察[mongoConnect]日志行任何[main]日志行之前总是打印此流程。

MongoConnect传递客户为回调

我很困惑,这里的回调。我们返回客户端的承诺,但我们如何执行,在回调?如果客户对象是回调那么是不是在客户端调用客户端?什么是相当于回调?

const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;

const mongoConnect = callback => {
  MongoClient.connect(
    'mongodb+srv://<user>:<password>@cluster0-ntrwp.mongodb/test?retryWrites=true'
  )
    .then(client => {
      console.log('Connected!');
      callback(client);
    })
    .catch(err => {
      console.log(err);
    });
};

module.exports = mongoConnect;


(app.js)
mongoConnect(client => {
  console.log(client);
  app.listen(3000);
});

这不是预期的输出。我有点困惑这里的回调。

const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;

const mongoConnect = client => {
      console.log(client);
      app.listen(3000); => {
  MongoClient.connect(
    'mongodb+srv://<user>:<password>@cluster0-ntrwp.mongodb/test?retryWrites=true'
  )
    .then(client => {
      console.log('Connected!');
      client => {
        console.log(client);
        app.listen(3000);(client);
    })
    .catch(err => {
      console.log(err);
    });
};

module.exports = mongoConnect;


(app.js)
mongoConnect(client => {
  console.log(client);
  app.listen(3000);
});
回答如下:

我猜你问的第一个代码是如何工作的。我重写了第一代码使用旧学校function()代替ES6脂肪箭头,并把一些日志记录,以使其更清晰这是怎么回事:

const express = require('express');
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
const app = express();

function mongoConnect(callback) {
  MongoClient.connect('mongodb://localhost:27017')
    .then(client => {
      console.log('[mongoConnect] Connected!');
      console.log('[mongoConnect] callback type: ' + typeof(callback));
      console.log('[mongoConnect] client type: ' + typeof(client));
      console.log('[mongoConnect] client is: ' + client.constructor.name);
      callback(client);
    })
    .catch(err => {
      console.log(err);
    });
};

mongoConnect(function(client) {
  console.log('[main] client type: ' + typeof(client));
  console.log('[main] client is: ' + client.constructor.name);
  app.listen(3000, function() {
    console.log('[main] listening on 3000');
  });
});

运行代码:

[mongoConnect] Connected!
[mongoConnect] callback type: function
[mongoConnect] client type: object
[mongoConnect] client is: MongoClient
[main] client type: object
[main] client is: MongoClient
[main] listening on 3000

至于你的问题:

如果客户对象是回调那么是不是在客户端调用客户端?什么是相当于回调?

为了解开这是怎么回事:

  • client是一个对象,并且callback是一个函数。
  • mongoConnect()接受一个函数作为参数。
  • 获取传递到mongoConnect()该函数接受client(一个对象)作为参数。从技术上讲,这是没有必要的。我想这是只有在那里审计/日志记录。您可以删除所有提到的那部分代码client的,并认为它仍然有效。

例如,你可以改变的代码位是:

mongoConnect(function() {
  app.listen(3000, function() {
    console.log('[main] listening on 3000');
  });
});

它仍然会工作方式相同。

执行顺序是:

  1. mongoConnect(function(client))被称为
  2. 里面mongoConnectMongoClient.connect()被称为
  3. 一旦连接,回调(function(client))被称为
  4. 回调执行app.listen()

这个流程顺序保证了应用进入侦听模式前的数据库连接。不这样做,被确认之前的任何数据库连接(例如,由于比预期的数据库连接等更慢)的应用可以听。您可以确认通过观察[mongoConnect]日志行任何[main]日志行之前总是打印此流程。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论