不确定 javascript 中异步和回调的使用
Unsure about usage of async and callbacks in javascript
描述:
我的 Node-App 中有一个 Mocha 测试,它应该测试 Mongo-DB-JSON-Documents 的 DB-Export 是否正确完成。
在我的测试中,除了其他测试之外,我还测试下载目录是否不为空。
预期结果:
测试应该等待下载,然后才检查目录是否为空。
实际结果:
测试returns总是绿色。
我的问题:
我知道我们有回调,但承诺更好。
我知道 async await 是 promises 的语法糖。
而且我知道甚至还有 RxJS(我在这里不使用)
我必须以某种方式处理来自 mogodb-backup 的回调。
参见 https://www.npmjs.com/package/mongodb-backup
我不明白我做错了什么,所以测试总是变成绿色(运行 与下载并行)
摩卡-test.js
describe('Database.downloadDocumentsOfType_KEYS()', function () {
it('should result in data/exportFromCosmos/KEYS/admin/ag-data/ not being empty', function () {
const config = {
documents: ['DEFAULT', 'KEYS'],
exportpathDEFAULT: 'data/exportFromCosmos/DEFAULT/',
exportpathKEYS: 'data/exportFromCosmos/KEYS/',
uploadpath: 'data/uploadToAzureBlob/',
crosscheckFile: 'data/crosscheckFile.txt'
}
async function f() {
await Database.downloadDocumentsOfType_KEYS().then(expect(dir(config.exportpathKEYS + 'admin/ag-data/')).to.not.be.empty)
}
f()
})
})
数据库模块-tested.js
const mongodbbackup = require('mongodb-backup')
const Database = {
downloadDocumentsOfType_DEFAULT: () => {
new Promise((resolve) => mongodbbackup({
uri: process.env.DB_CONNECTION_STRING_READ,
root: 'data/exportFromCosmos/DEFAULT',
parser: 'json',
callback: function(err) {
if (err) {
reject()
} else {
resolve()
}
}
)}
}
async function f() {
await Database.downloadDocumentsOfType_KEYS().then(e)
}
f()
这会立即触发异步函数并且
it('...', function (){})
立即完成。
所以你需要使用
describe('...',async function(){
it('...',async function(){
const f = async function(){
await Database.downloadDocumentsOfType_KEYS();
expect(dir(config.exportpathKEYS + 'admin/ag-data/')).to.not.be.empty);
};
await f();
});
});
此外,
new Promise((resolve) => mongodbbackup({...
应该是
new Promise((resolve,reject) => mongodbbackup({
否则拒绝是undefined
描述:
我的 Node-App 中有一个 Mocha 测试,它应该测试 Mongo-DB-JSON-Documents 的 DB-Export 是否正确完成。 在我的测试中,除了其他测试之外,我还测试下载目录是否不为空。
预期结果:
测试应该等待下载,然后才检查目录是否为空。
实际结果:
测试returns总是绿色。
我的问题:
我知道我们有回调,但承诺更好。 我知道 async await 是 promises 的语法糖。 而且我知道甚至还有 RxJS(我在这里不使用)
我必须以某种方式处理来自 mogodb-backup 的回调。 参见 https://www.npmjs.com/package/mongodb-backup
我不明白我做错了什么,所以测试总是变成绿色(运行 与下载并行)
摩卡-test.js
describe('Database.downloadDocumentsOfType_KEYS()', function () {
it('should result in data/exportFromCosmos/KEYS/admin/ag-data/ not being empty', function () {
const config = {
documents: ['DEFAULT', 'KEYS'],
exportpathDEFAULT: 'data/exportFromCosmos/DEFAULT/',
exportpathKEYS: 'data/exportFromCosmos/KEYS/',
uploadpath: 'data/uploadToAzureBlob/',
crosscheckFile: 'data/crosscheckFile.txt'
}
async function f() {
await Database.downloadDocumentsOfType_KEYS().then(expect(dir(config.exportpathKEYS + 'admin/ag-data/')).to.not.be.empty)
}
f()
})
})
数据库模块-tested.js
const mongodbbackup = require('mongodb-backup')
const Database = {
downloadDocumentsOfType_DEFAULT: () => {
new Promise((resolve) => mongodbbackup({
uri: process.env.DB_CONNECTION_STRING_READ,
root: 'data/exportFromCosmos/DEFAULT',
parser: 'json',
callback: function(err) {
if (err) {
reject()
} else {
resolve()
}
}
)}
}
async function f() {
await Database.downloadDocumentsOfType_KEYS().then(e)
}
f()
这会立即触发异步函数并且
it('...', function (){})
立即完成。
所以你需要使用
describe('...',async function(){
it('...',async function(){
const f = async function(){
await Database.downloadDocumentsOfType_KEYS();
expect(dir(config.exportpathKEYS + 'admin/ag-data/')).to.not.be.empty);
};
await f();
});
});
此外,
new Promise((resolve) => mongodbbackup({...
应该是
new Promise((resolve,reject) => mongodbbackup({
否则拒绝是undefined