Обещание возвращается с неопределенным кодом или скомпилированный код babel не ждет возврата (async / await) - PullRequest
0 голосов
/ 07 июня 2019

Существует асинхронная функция (send), в которой, если атрибут msg не определен, другая функция (getNextProcess) устанавливает его значение.getNextProcess выполняет запрос к базе данных в Обещании.Обратный вызов запроса функция разрешения 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",
  ]
}

1 Ответ

2 голосов
/ 07 июня 2019

Похоже, вы забыли вернуть обещание в getNextProcess.await не знает, чего ждать, если вы не дадите ему обещание.

getNextProcess(){
    return new Promise(res => {
        //...
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...