javascript - 如何获取从承诺返回的值并在其他文件中使用它?
问题描述
我创建了一个小项目来展示这个问题。
该项目中有5个文件。一个包含所有依赖注入的容器文件;包含我需要运行的功能的服务文件;一个控制器文件,它调用服务文件中的函数;一个app文件,它是最高级别的应用程序,它将调用所有的控制器文件,在这个例子中只有1个;一个 index.js 文件,它是应用程序的起点。
容器.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;
服务.js:
module.exports = class Service {
doService() {
return new Promise(resolve => {
setTimeout(() => resolve("Hello from service!"), 2000);
});
}
}
控制器.js:
module.exports = class Controller {
constructor({ service }) {
this.service = service;
}
doWork() {
this.service.doService().then(response => {
this.message = response;
return this.message;
})
}
}
应用程序.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 属性变为“来自服务的您好!” 并能够 console.log 将其注销。调用顺序应该是:
index.js --> app.js --> controller.js --> service.js --> controller.js --> app.js
所有依赖项都使用 awilix js 注入到 container.js 中。
我很确定是我搞砸了从controller.js 中的promise 返回它,因为如果我使用其他同步功能,它就可以工作。
请让我知道为什么我错了,如何使它工作。
解决方案
您不会返回您在 controller.doWork() 中创建的承诺。当您等待 controller.doWork() 的结果时,在您的“开始”功能中,没有任何价值。该函数不返回“等待”的承诺或任何与此相关的内容。
module.exports = class Controller {
constructor({ service }) {
this.service = service;
}
//Needs to return a value.
doWork() {
// This is a promise, you need to return it.
//this.service.doService().then(response => {
// this.message = response;
// return this.message;
//})
return this.service.doService().then(response => {
this.message = response;
return this.message;
})
}
app.js 中的 await 语句是类似以下内容的语法糖:
this.controller.doWork().then(response => {
this.doc = response;
});
我们可以使用 await 来“自动”解开 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() 值的代码变得更长和/或更复杂时。
推荐阅读
- android - 如何使用 Appium 更改 android 用户帐户?
- gis - Repast 在示例文件中不显示背景地图
- python - 使用 python 登录使用 cookie 的网站
- python - 即使出现错误,也要确保循环遍历每个文件
- php - 带有数组的空 url 参数未使用 PHP empty() 函数标记为空
- python - 如何在 simpleaudio 库中设置音量?
- javascript - 为什么这个滑块会带入滑块下方的内容,然后再向上?
- vue.js - 更漂亮的 ESLint 循环错误
- azure-data-explorer - 尝试使用过去 30 天内未登录的用户创建 KQL
- vb.net - 在 Visio 2016 或 2019 中设置刷新后自动链接