Javascript 如何在extend Error中等待promise
Javascript how await promise inside extend Error
我目前正在尝试扩展 javascript 的标准错误 class 以解决流程问题,更准确地说,我想在抛出自定义错误时检查 FTP 数据。问题是它从不等待 await 函数在抛出之前完成。等待的函数 return 也是一个承诺。
就我而言,我有 class 的示例代码,请注意,remoteFs 只是一个自定义模块,其中包含我用来操作远程 FTP 数据的函数。
module.exports = class processError extends Error {
constructor(args) {
super(args);
this.name = "customError"
this._folder = "./test/"
this._credentials = {
host: 'my.host.com',
user: 'username',
password: 'passwd123',
}
return (this._errorProcess());
}
async _errorProcess () {
try {
// The function below is basic FTP list and should return a promised true/false if the folder exists or not.
let IsThereFolder = await remoteFs.EntityExist(this._credentials, this._folder)
} catch (err) {
throw new Error("Fatal error in error handler:", err)
}
console.log("Should I create folder ?", IsThereFolder )
return (this);
}
}
我尝试了几种让构造函数等待的方法,例如从 init() 函数调用 _errorProcess,它会在从构造函数调用后 return 它。我也尝试将此函数放在 class 范围之外,但似乎没有任何效果,我总是在收到我的承诺之前得到抛出输出。
module.exports = {
EntityExist: function (credentials, toFind) {
var c = new Client();
let entityExist = false;
return new Promise((resolve, reject) => {
console.log("CREDENTIALS ->", credentials)
c.on('ready', function () {
console.log("Connection established");
c.on('error', function (err) {
console.log(err);
reject(err);
})
c.list(toFind, (err, list) => {
if (err) throw err;
for (let i = 0; i < list.length; i++) {
if (list[i].name == toFind) { entityExist = true; }
}
c.on('end', () => { resolve(entityExist); })
c.end();
});
});
console.log("Before connect")
c.connect(credentials);
})
}
};
这里是我这次执行得到的实际输出:
CREDENTIALS -> { host: 'my.host.com',
user: 'username',
password: 'passwd123' }
Before connect
C:\path_to_project\includes\file.js:62
throw new handleError("Testing custom error: " + err); break;
^
[object Promise]
npm ERR! code ELIFECYCLE
npm ERR! errno 1
(...)
所以如您所见,它不会等待 promise 返回,甚至不会到达 "Connection established" 登录 EntityExist 函数(请注意,此函数在其他情况下工作正常).
实际上,我什至不知道是否可以直接从构造函数执行此类操作。
我希望上下文足够清楚,感谢您的宝贵时间!
The await operator is used to wait for a Promise. It can only be used inside an async function.
这意味着您不能在全局范围内或在 class 构造函数中使用。
使用 promise 的构造函数是一种不好的做法,因为您将无法同时获得 class (link to another Whosebug answer)。
从技术上讲,您可以 return 来自构造函数的 Promise,但这不是他的目的。
对于你的情况,你可以在调用 throw 之前使用一个函数,这不是很漂亮,但它完成了工作。
作为:
async generateAsyncError(asyncFn) {
await asyncFn();
throw new Error();
}
在这里你可以在抛出错误之前使用异步。但请记住,在异步函数完成之前不会抛出错误。
我目前正在尝试扩展 javascript 的标准错误 class 以解决流程问题,更准确地说,我想在抛出自定义错误时检查 FTP 数据。问题是它从不等待 await 函数在抛出之前完成。等待的函数 return 也是一个承诺。
就我而言,我有 class 的示例代码,请注意,remoteFs 只是一个自定义模块,其中包含我用来操作远程 FTP 数据的函数。
module.exports = class processError extends Error {
constructor(args) {
super(args);
this.name = "customError"
this._folder = "./test/"
this._credentials = {
host: 'my.host.com',
user: 'username',
password: 'passwd123',
}
return (this._errorProcess());
}
async _errorProcess () {
try {
// The function below is basic FTP list and should return a promised true/false if the folder exists or not.
let IsThereFolder = await remoteFs.EntityExist(this._credentials, this._folder)
} catch (err) {
throw new Error("Fatal error in error handler:", err)
}
console.log("Should I create folder ?", IsThereFolder )
return (this);
}
}
我尝试了几种让构造函数等待的方法,例如从 init() 函数调用 _errorProcess,它会在从构造函数调用后 return 它。我也尝试将此函数放在 class 范围之外,但似乎没有任何效果,我总是在收到我的承诺之前得到抛出输出。
module.exports = {
EntityExist: function (credentials, toFind) {
var c = new Client();
let entityExist = false;
return new Promise((resolve, reject) => {
console.log("CREDENTIALS ->", credentials)
c.on('ready', function () {
console.log("Connection established");
c.on('error', function (err) {
console.log(err);
reject(err);
})
c.list(toFind, (err, list) => {
if (err) throw err;
for (let i = 0; i < list.length; i++) {
if (list[i].name == toFind) { entityExist = true; }
}
c.on('end', () => { resolve(entityExist); })
c.end();
});
});
console.log("Before connect")
c.connect(credentials);
})
}
};
这里是我这次执行得到的实际输出:
CREDENTIALS -> { host: 'my.host.com',
user: 'username',
password: 'passwd123' }
Before connect
C:\path_to_project\includes\file.js:62
throw new handleError("Testing custom error: " + err); break;
^
[object Promise]
npm ERR! code ELIFECYCLE
npm ERR! errno 1
(...)
所以如您所见,它不会等待 promise 返回,甚至不会到达 "Connection established" 登录 EntityExist 函数(请注意,此函数在其他情况下工作正常).
实际上,我什至不知道是否可以直接从构造函数执行此类操作。 我希望上下文足够清楚,感谢您的宝贵时间!
The await operator is used to wait for a Promise. It can only be used inside an async function.
这意味着您不能在全局范围内或在 class 构造函数中使用。
使用 promise 的构造函数是一种不好的做法,因为您将无法同时获得 class (link to another Whosebug answer)。
从技术上讲,您可以 return 来自构造函数的 Promise,但这不是他的目的。
对于你的情况,你可以在调用 throw 之前使用一个函数,这不是很漂亮,但它完成了工作。
作为:
async generateAsyncError(asyncFn) {
await asyncFn();
throw new Error();
}
在这里你可以在抛出错误之前使用异步。但请记住,在异步函数完成之前不会抛出错误。