Javascript 在脚本标记中使用承诺不起作用?

Javascript 在脚本标记中使用承诺不起作用?,javascript,reactjs,ecmascript-6,promise,es6-promise,Javascript,Reactjs,Ecmascript 6,Promise,Es6 Promise,下面的代码用于使用承诺在DOM中附加脚本。(以下所有代码都在A-frame技术的iframe内部执行,我的代码是使用Google Blockly[基于块的编码]生成的) export const appendScript=async({ src, 一扇窗户, 代码, 身份证件 }, 博士, 回拨, ) => 新承诺(解决=>{ const startDate=新日期(); 常量脚本=doc.createElement('script'); 如果(src)script.src=src; if(代

下面的代码用于使用承诺在DOM中附加脚本。(以下所有代码都在A-frame技术的iframe内部执行,我的代码是使用Google Blockly[基于块的编码]生成的)

export const appendScript=async({
src,
一扇窗户,
代码,
身份证件
},
博士,
回拨,
) =>
新承诺(解决=>{
const startDate=新日期();
常量脚本=doc.createElement('script');
如果(src)script.src=src;
if(代码){
script.text=代码;
}
如果(id){
script.id=id;
}
doc.head.appendChild(脚本);
if(callback)callback();
if(代码){
如果(回调){
回调();
}
console.log(aframeWindow.onGreenPlayButtonClicked,“==”;//当代码字符串包含onGreenPlayButtonClicked fn之外的wait时未定义
解决(“已解决”);
}否则{
script.addEventListener('load',()=>{
const endDate=新日期();
常量秒=(endDate.getTime()-startDate.getTime())/1000;
log('script-loaded:',src,`take${seconds}加载`);
决议(“决议2”);
});
}

});
appendScript
中没有任何内容等待
main()
调用返回的承诺。如果异步初始化
onGreenPlayButtonClicked
,则在附加脚本元素后,它不会立即可用

我建议你试试

const callAppendScript = async code => {
  const CODE_VERSION = aframeWindow.CODE_VERSION;
  code = `
    async function main(inPlayMode) {
      let CURRENT_CODE_VERSION = CODE_VERSION;
      ${code};
    }
    // no main() call here
  `;
  await appendScript({
    code,
    aframeWindow,
    id: 'code'
  }, aframeWindow.document);

  console.log(aframeWindow.onGreenPlayButtonClicked, "before");
  await main();
//^^^^^^^^^^^^
  console.log(aframeWindow.onGreenPlayButtonClicked, "after");
}

appendScript
中没有任何内容等待
main()
调用返回的承诺。如果异步初始化
onGreenPlayButtonClicked
,则在附加脚本元素后,它不会立即可用

我建议你试试

const callAppendScript = async code => {
  const CODE_VERSION = aframeWindow.CODE_VERSION;
  code = `
    async function main(inPlayMode) {
      let CURRENT_CODE_VERSION = CODE_VERSION;
      ${code};
    }
    // no main() call here
  `;
  await appendScript({
    code,
    aframeWindow,
    id: 'code'
  }, aframeWindow.document);

  console.log(aframeWindow.onGreenPlayButtonClicked, "before");
  await main();
//^^^^^^^^^^^^
  console.log(aframeWindow.onGreenPlayButtonClicked, "after");
}

谢谢,它可以工作了,我必须提高我的技能如果我在OngreenPlayButtonClick中没有使用async怎么办?它是否会提升OngreePlay按钮的功能声明?我以为它会被提升,我可以调用它,但它仍然没有定义,有什么特别的原因吗?@Coderboi问题不在于
ongreenplaybuttonclick
中的
async
代码,而在于
main
中的
async
代码本身-具体地说,
等待HatchTranslateEngine.translate(`Hello`,'en'))
。谢谢,它很管用,我必须提高我的技能。如果我在OngreenPlayButtonClick中没有使用async,该怎么办?它是否会提升OngreePlay按钮的功能声明?我以为它会被提升,我可以调用它,但它仍然没有定义,有什么特别的原因吗?@Coderboi问题不在于
ongreenplaybuttonclick
中的
async
代码,而在于
main
中的
async
代码本身-具体地说,
等待HatchTranslateEngine.translate(`Hello`,'en'))