我对这里的回调感到困惑。我们在promise中返回客户,但是我们如何在回调中执行它呢?如果客户端对象是回调,那么客户端不是在调用客户端吗?回调相当于什么?
$productsArr = json_decode($_POST['products']);
这不是预期的输出。我对这里的回调有些困惑。
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
const mongoConnect = callback => {
MongoClient.connect(
'mongodb+srv://<user>:<password>@cluster0-ntrwp.mongodb.net/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);
});
答案 0 :(得分:0)
我猜你在问第一个代码是如何工作的。我重新编写了第一个代码,以使用旧式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');
});
});
,它仍将以相同的方式工作。
执行顺序为:
mongoConnect(function(client))
被称为mongoConnect
内,MongoClient.connect()
被称为function(client)
)app.listen()
此流程顺序可确保在应用程序进入侦听模式之前已连接数据库。如果没有此设置,则应用程序可以在确认任何数据库连接之前侦听(例如,由于数据库连接速度比预期的慢等)。您可以通过观察在所有[mongoConnect]
日志行之前之前打印[main]
日志行来确认此流程。