【问题标题】:Function in .then() not getting called.then() 中的函数没有被调用
【发布时间】:2021-09-23 03:51:51
【问题描述】:

我在函数中使用 Promise 以确保当我尝试修复某些 CSS 样式时,函数加载的动态元素可用。但是 fixStyling 永远不会执行。我究竟做错了什么?有没有更好的方法来做到这一点?

const fixStyling = function(){
   console.log('change style');
   let surveyBody = document.querySelector('.survey-page-body');
   surveyBody.style.marginTop = "-60px";
}


function loadSM() {
    return new Promise(function(resolve) {
       (function(t,e,s,n){var o,a,c;t.SMCX=t.SMCX||[],e.getElementById(n)||(o=e.getElementsByTagName(s),a=o[o.length-1],c=e.createElement(s),c.type="text/javascript",c.async=!0,c.id=n,c.src="https://widget.surveymonkey.com/collect/website/js/tRaiETqnLgj758hTBazgd1CDe7_2F_2F4snTovolmrpjpv7u54RGrphPxAqunQp3_2FUPz.js",a.parentNode.insertBefore(c,a))})(window,document,"script","smcx-sdk");
   });
}

loadSM().then(fixStyling());

【问题讨论】:

  • .then 接受回调。您正在传入一个被调用的函数。尝试删除 ()。
  • 很棒的捕获@Invizi 也许指向需要从哪里删除它会帮助他/她,例如尝试删除 () 并使其成为 loadSM().then(fixStyling);。只是我的一点帮助,以使您的答案完整。和平!!
  • 感谢@Invizi 和@Avinash!我实际上也尝试过,但它仍然跳过了 fixStyling,这让我想知道 Promise 是否是问题,但我正在使用 resolve,所以我不知所措。

标签: javascript async-await promise


【解决方案1】:

就像提到的Invizi
该函数接受回调。

所以要么像这样 - loadSM().then(fixStyling);
或者像这样 - loadSM().then(() => fixStyling());

【讨论】:

  • 我实际上也尝试过回调,但它也不起作用。我可以在 DevTools 中看到 loadSM() 如何按预期执行,但由于某种原因跳过了 fixStyling。不幸的是,ES6 与我公司内部使用的浏览器不兼容,因此无法使用箭头 fn。
【解决方案2】:

您的代码无法运行的原因是您在 loadSM() 中做出的承诺。您从未解决或拒绝过承诺,因此从未触发过下一步。

function fixStyling() {
  console.log('change style');
  let surveyBody = document.querySelector('.survey-page-body');
  surveyBody.style.marginTop = "-60px";
}


function loadSM() {
  return Promise.resolve(
    (function(t, e, s, n) {
      var o, a, c;
      t.SMCX = t.SMCX || [], e.getElementById(n) || (o = e.getElementsByTagName(s), a = o[o.length - 1], c = e.createElement(s), c.type = "text/javascript", c.async = !0, c.id = n, c.src = "https://widget.surveymonkey.com/collect/website/js/tRaiETqnLgj758hTBazgd1CDe7_2F_2F4snTovolmrpjpv7u54RGrphPxAqunQp3_2FUPz.js", a.parentNode.insertBefore(c, a))
    })(window, document, "script", "smcx-sdk"));
}

loadSM().then(fixStyling);

【讨论】:

  • 成功了 - 谢谢!
猜你喜欢
  • 2016-12-11
  • 1970-01-01
  • 2016-06-02
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多