javascript - Promise 返回 'undefined' 或 babel 编译的代码不等待返回 (async/await)
问题描述
有一个异步函数 ( send
),如果msg
未定义属性,则另一个函数 ( getNextProcess
) 设置其值。
getNextProcess
在 Promise 中执行数据库查询。查询回调 Promise 解析函数。
问题:
使用 Babel 翻译代码后,msg
将始终为“未定义”。Promise 在后台独立运行并返回正确的值(通过控制台日志检查)。
/* ORIGINAL */
class MyClass(){
/*
construct & other codes here...
*/
getNextProcess(){
new Promise(res => {
logDb.get("SELECT * FROM process WHERE details NOT LIKE '%isComplete:true%' ORDER BY id LIMIT 1", (e, r) => {
let result = JSON.parse(r.details);
result.id = r.id;
res(result);
});
});
}
async send(msg = undefined){
if (!msg) msg = await this.getNextProcess();
webView.send('webview:receive', msg);
}
}
/* Transformed */
{
key: "send",
value: function () {
var _send = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee() {
var msg,
_args = arguments;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
msg = _args.length > 0 && _args[0] !== undefined ? _args[0] : undefined;
if (msg) {
_context.next = 5;
break;
}
_context.next = 4;
return this.getNextProcess();
case 4:
msg = _context.sent;
case 5:
this.webView.send('webview:receive', msg);
case 6:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function send() {
return _send.apply(this, arguments);
}
return send;
}()
}
/* package.json */
// ...
"scripts": {
"start": "npm run compile && electron main.js",
"compile": "browserify -t [ babelify --presets [ @babel/preset-env ] ] src/app.js -o js/app.js",
},
"devDependencies": {
"@babel/core": "^7.4.5",
"@babel/plugin-transform-async-to-generator": "^7.4.4",
"@babel/plugin-transform-regenerator": "^7.4.5",
"@babel/plugin-transform-runtime": "^7.4.4",
"@babel/preset-env": "^7.4.5",
"@babel/runtime": "^7.4.5",
"babel-core": "^7.0.0-bridge.0",
"babelify": "^10.0.0",
"browserify": "^13.0.1",
"electron": "^4.1.4",
"electron-rebuild": "^1.8.5"
},
// ...
/* .babelrc */
{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "entry"
}
]
],
"ignore": [
"../node_modules/jquery/dist/jquery.js"
],
"plugins": [
["@babel/plugin-transform-runtime", {
"helpers": true,
"regenerator": true
}],
"@babel/plugin-transform-async-to-generator",
"@babel/plugin-transform-regenerator",
]
}
解决方案
看起来您忘记在 getNextProcess 中返回承诺。
await
如果你不给它一个承诺,不知道要等什么。
getNextProcess(){
return new Promise(res => {
//...
});
}
推荐阅读
- c - Xcode 11.5 使用 .C 源时架构 arm64 的未定义符号
- javascript - 如何在页面刷新时显示加载器/微调器并且需要等待 React JS 中的 authUser 结果?
- c# - 如何在 xamarin.forms 的 viewcell 中设置按钮以从内容页面视图模型中调用命令?
- mysql - 谷歌云平台 - 来自具有公共 IP 的计算引擎实例的 mySQL 访问被拒绝
- java - Java 将 object 类型的 ArrayList 转换为 object 类型的另一个 ArrayList
- chisel - Chisel3: Vec indexWhere 预期 Bool,实际 Any
- ios - 在 xcode 11.6 中反应原生崩溃
- c++ - 在 ubuntu 环境中为 c++ 配置 Netbeans IDE
- javascript - 根据父组件中的值动态加载名称
- java - 使用 Java 流将哈希图收集到 ArrayList 时出现 ConcurrentModificationException