Merge pull request #849 from embark-framework/bugfix/better-support-for-await

Better support for await
This commit is contained in:
Iuri Matias 2018-09-17 14:11:20 -04:00 committed by GitHub
commit d6f1925cec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 12 deletions

View File

@ -1,4 +1,5 @@
const RunCode = require('./runCode.js'); const RunCode = require('./runCode.js');
const Utils = require('../../../utils/utils');
class CodeRunner { class CodeRunner {
constructor(options) { constructor(options) {
@ -59,19 +60,23 @@ class CodeRunner {
this.runCode.registerVar(varName, code); this.runCode.registerVar(varName, code);
} }
evalCode(code, cb, forConsoleOnly = false) { async evalCode(code, cb, forConsoleOnly = false) {
cb = cb || function() {}; cb = cb || function() {};
const awaitIdx = code.indexOf('await'); const awaitIdx = code.indexOf('await');
let awaiting = false;
if (awaitIdx > -1) { if (awaitIdx > -1) {
if (awaitIdx < 2) { awaiting = true;
let end = code.length; const instructions = Utils.compact(code.split(';'));
if (code[end - 1] === ';') { const last = instructions.pop();
end--; // Remove the `;` because we add function calls
} if (!last.trim().startsWith('return')) {
code = code.substring(5, end); // remove await keyword instructions.push(`return ${last}`);
} else { } else {
code = `(async function() {${code}})();`; instructions.push(last);
} }
code = `(async function() {${instructions.join(';')}})();`;
} }
let result = this.runCode.doEval(code); let result = this.runCode.doEval(code);
@ -80,11 +85,16 @@ class CodeRunner {
this.ipc.broadcast("runcode:newCommand", {code}); this.ipc.broadcast("runcode:newCommand", {code});
} }
if (result instanceof Promise && !result.on) { if (!awaiting) {
return result.then((value) => { cb(null, value); }).catch(cb); return cb(null, result);
} }
cb(null, result); try {
const value = await result;
cb(null, value);
} catch (error) {
cb(error);
}
} }
} }

View File

@ -41,7 +41,7 @@ config({
} }
}, },
SomeContract: { SomeContract: {
deployIf: "MyToken.methods.isAvailable().call()", deployIf: "await MyToken.methods.isAvailable().call()",
args: [ args: [
["$MyToken2", "$SimpleStorage"], ["$MyToken2", "$SimpleStorage"],
100 100