【scratch-vm応用講座】スクラッチの拡張機能でもasync/await構文を使う方法
※ 当ページには【広告/PR】を含む場合があります。
2021/12/12
スクラッチではasync/awaitが呼び出せない問題
index.js:68 Uncaught ReferenceError: regeneratorRuntime is not defined
at index.js:68
at index.js:69
at Object../node_modules/scratch-vm/src/extensions/*****/index.js (index.js:78)
at __webpack_require__ (bootstrap:84)
at Object.******** (extension-manager.js:19)
at ExtensionManager.loadExtensionURL (extension-manager.js:153)
at ExtensionLibrary.handleItemSelect (extension-library.jsx:43)
at Object.wrapper [as onItemSelected] (index.js:550)
at LibraryComponent.handleSelect (library.jsx:68)
at Object.wrapper [as onSelect] (index.js:550)
Babelランタイムの追加
$ cd scratch-vm
$ yarn add @babel/runtime @babel/plugin-transform-runtime -D
virtual-machine.js
//👇とりあえずコードの冒頭に二行を追加
require('core-js');
require('regenerator-runtime/runtime');
//...以下略
動作確認
index.js
const ArgumentType = require('../../extension-support/argument-type');
const BlockType = require('../../extension-support/block-type');
const Cast = require('../../util/cast');
const log = require('../../util/log');
class Scratch3AsyncTest {
constructor (runtime) {
this.runtime = runtime;
}
getInfo () {
return {
id: 'asynctest',
name: 'Debug for testing Async/Await',
blocks: [
{
opcode: 'testAsync',
text: 'Async/Await tester',
blockType: BlockType.COMMAND
}
],
menus: {
}
};
}
//👇await出来ようにPromiseの関数を定義
myFirstPromise(message) {
console.log('一秒遅延しています...');
return new Promise(resolve => {
setTimeout(() => {
resolve(message);
}, 1000);
})
}
//👇クラス内にasyncメンバ関数を定義
async myFirstAsync() {
const result = await this.myFirstPromise('はじめてのAsync/Awaitへようこそ!');
return result;
}
testAsync () {
//👇スクラッチブロックからでもasync関数が呼び出せるようになる
this.myFirstAsync().then(result => {
console.log(result);
});
}
}
module.exports = Scratch3AsyncTest;
まとめ
参考サイト
記事を書いた人
ナンデモ系エンジニア
これからの"地方格差"なきプログラミング教育とは何かを考えながら、 地方密着型プログラミング学習関連テーマの記事を不定期で独自にブログ発信しています。
カテゴリー