Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript如何在扩展错误中等待承诺_Javascript_Node.js_Constructor_Async Await_Extends - Fatal编程技术网

Javascript如何在扩展错误中等待承诺

Javascript如何在扩展错误中等待承诺,javascript,node.js,constructor,async-await,extends,Javascript,Node.js,Constructor,Async Await,Extends,我目前正在尝试扩展javascript的标准错误类以解决流程问题,更准确地说,我希望在抛出customError时检查FTP数据。问题是它从不等待等待函数完成后再抛出。等待的函数也会返回一个承诺 就我而言,我的类有这个示例代码,请注意,remoteFs只是一个自定义模块,其中包含了我操作远程FTP数据的函数 module.exports = class processError extends Error { constructor(args) { super(args

我目前正在尝试扩展javascript的标准错误类以解决流程问题,更准确地说,我希望在抛出customError时检查FTP数据。问题是它从不等待等待函数完成后再抛出。等待的函数也会返回一个承诺

就我而言,我的类有这个示例代码,请注意,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,该函数在从构造函数调用后将返回它。我还试图把这个函数放在类范围之外,但似乎没有什么能正常工作,我总是在收到承诺之前得到抛出输出

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);
       })
   }
};

因此,正如您所看到的,它不会等待承诺返回,甚至不会到达EntityExist函数上的“已建立连接”日志(请注意,此函数在其他情况下不会正常工作)

实际上,我甚至不知道是否有可能直接从构造函数执行这样的操作。 我希望上下文足够清楚,谢谢你的时间

wait操作符用于等待承诺。它只能在异步函数中使用

这意味着您不能在全局范围或类构造函数中使用

使用promise的构造函数是一种糟糕的做法,因为您将无法获得类

从技术上讲,你可以从构造器那里返回一个承诺,但这不是他的目的

就您的情况而言,您可以在调用抛出之前使用函数,这并不漂亮,但它确实起到了作用

作为:

在这里,您可以在抛出错误之前使用async。但是请记住,在异步函数完成之前不会抛出错误

wait操作符用于等待承诺。它只能在异步函数中使用

这意味着您不能在全局范围或类构造函数中使用

使用promise的构造函数是一种糟糕的做法,因为您将无法获得类

从技术上讲,你可以从构造器那里返回一个承诺,但这不是他的目的

就您的情况而言,您可以在调用抛出之前使用函数,这并不漂亮,但它确实起到了作用

作为:


在这里,您可以在抛出错误之前使用async。但是请记住,在异步函数完成之前不会抛出错误。

您是否尝试过
return wait(this.\u errorProcess())?我刚刚尝试过,显然这是不可能的,并抛出错误提示:
ReferenceError:await未定义
您不能在全局或构造函数范围内使用async/await是的,这是我从文档中得到的,有没有什么方法可以让我在按照这种模式抛出和退出程序之前保留一些数据?您是否尝试过
return await(this.\u errorProcess())?我刚刚尝试过,显然这是不可能的,并抛出错误提示:
ReferenceError:await未定义
您不能在全局或构造函数范围内使用async/await是的,这是我从文档中得到的,有没有什么工作可以让我在按照这样的模式启动和退出程序之前保留一些数据?是的,这不是我所期望的最好的,但它确实工作得很好,谢谢你的帮助。是的,这不是我所期望的最好的,但它确实工作得很好,谢谢你的帮助。
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
(...)
async generateAsyncError(asyncFn) {
  await asyncFn();

  throw new Error();
}