Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.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_Dependency Injection_Promise_Ioc Container - Fatal编程技术网

Javascript 如何获取承诺返回的值并在其他文件中使用它?

Javascript 如何获取承诺返回的值并在其他文件中使用它?,javascript,node.js,dependency-injection,promise,ioc-container,Javascript,Node.js,Dependency Injection,Promise,Ioc Container,我创建了一个小项目来展示这个问题 此项目中有5个文件。 包含所有依赖项的容器文件;包含我需要运行的函数的服务文件;调用服务文件中的函数的控制器文件;应用程序文件是调用所有控制器文件的最高级别应用程序,在本例中只有1个;作为应用程序起点的index.js文件 container.js: const { createContainer, asValue, asFunction, asClass, } = require('awilix'); const contai

我创建了一个小项目来展示这个问题

此项目中有5个文件。 包含所有依赖项的容器文件;包含我需要运行的函数的服务文件;调用服务文件中的函数的控制器文件;应用程序文件是调用所有控制器文件的最高级别应用程序,在本例中只有1个;作为应用程序起点的index.js文件

container.js:

const {
    createContainer,
    asValue,
    asFunction,
    asClass,
} = require('awilix');

const container = createContainer();

const Controller = require('./controller');
const Service = require('./service');

container.register({
    controller: asClass(Controller).singleton(),
    service: asClass(Service).singleton(),
})

const App = require('./app');

container.register({
    app: asClass(App).singleton(),
})

module.exports = container;    
service.js:

module.exports = class Service {

    doService() {
        return new Promise(resolve => {
            setTimeout(() => resolve("Hello from service!"), 2000);
        });
    }

}
controller.js:

module.exports = class Controller {
    constructor({ service }) {
        this.service = service;
    }

    doWork() {
        this.service.doService().then(response => {
            this.message = response;
            return this.message;
        })
    }
}
app.js:

module.exports = class App {
    constructor({ controller }) {
        this.controller = controller;
    }

    async start() {
        try {
            this.doc = await this.controller.doWork();
        } catch (err) {

        }
        console.log(this.doc);
    }
}
index.js:

const container = require('./container');

const app = container.resolve('app');

app.start();
我的目标是,我可以看到app.js中的doc属性变成“Hello from service!”并且能够控制台。注销它。调用顺序应为:

index.js-->app.js-->controller.js-->service.js-->controller.js-->app.js

所有依赖项都使用awilix js注入到container.js中

我很确定是我弄糟了什么,从controller.js中的promise返回它,因为如果我使用其他同步功能,它就工作了


请让我知道为什么我错了,以及如何让它工作。

您不返回在controller.doWork()中创建的承诺。等待controller.doWork()的结果时,在“start”函数中没有值。函数不返回“等待”的承诺或任何相关内容

app.js中的await语句的语法如下所示:

 this.controller.doWork().then(response => {
      this.doc = response;
 });
我们可以使用wait“自动”打开promise返回的值,并将其分配给变量,而不是编写它

它还暂停函数“start”,从而避免在“then”语句中写入函数的其余部分:

this.doc = await this.controller.doWork();
if (this.doc.type === "error") { 
    throw new Error(this.doc) 
}
比以下清洁得多:

this.controller.doWork().then(response => {
    this.doc = response;
    if (this.doc.type === "error") { 
        throw new Error(this.doc) 
    }
});

特别是当依赖于doWork()值的代码变得更长和/或更复杂时。

您不会返回在controller.doWork()中创建的承诺。等待controller.doWork()的结果时,在“start”函数中没有值。函数不返回“等待”的承诺或任何相关内容

app.js中的await语句的语法如下所示:

 this.controller.doWork().then(response => {
      this.doc = response;
 });
我们可以使用wait“自动”打开promise返回的值,并将其分配给变量,而不是编写它

它还暂停函数“start”,从而避免在“then”语句中写入函数的其余部分:

this.doc = await this.controller.doWork();
if (this.doc.type === "error") { 
    throw new Error(this.doc) 
}
比以下清洁得多:

this.controller.doWork().then(response => {
    this.doc = response;
    if (this.doc.type === "error") { 
        throw new Error(this.doc) 
    }
});

特别是当依赖于doWork()值的代码变得更长和/或更复杂时。

它起作用了,Thx buddy。我需要更多地了解承诺。所以为了让它工作,我们基本上需要返回一个承诺,它将返回一个消息变量?是的,您的函数需要返回一个承诺。在您的情况下,如果您不想将响应存储在这个.message中,您可以简单地编写“returnthis.service.doService();”doService是一个承诺,因此您已经满足了这个要求。我将在帖子中添加一些内容来澄清等待声明。谢谢,你是最好的。!:)成功了,伙计。我需要更多地了解承诺。所以为了让它工作,我们基本上需要返回一个承诺,它将返回一个消息变量?是的,您的函数需要返回一个承诺。在您的情况下,如果您不想将响应存储在这个.message中,您可以简单地编写“returnthis.service.doService();”doService是一个承诺,因此您已经满足了这个要求。我将在帖子中添加一些内容来澄清等待声明。谢谢,你是最好的。!:)