【问题标题】:Converting Async/Await function to normal ES5 targetting IE 11将 Async/Await 函数转换为针对 IE 11 的普通 ES5
【发布时间】:2020-03-14 23:15:21
【问题描述】:

所以,我需要您的帮助/协助来完成这些任务。

我使用箭头创建了一个搜索功能。经过测试,我注意到它不能单独在 IE 11 中运行。它虽然适用于其他浏览器。后来我意识到箭头函数在 IE 11 上不起作用。 所有让它发挥作用的努力都被证明是徒劳的。

请在下面找到箭头函数和我从箭头函数及其对应的JS创建的JS函数

箭头函数

<script>
    var search = document.getElementById('searchTerm_de');
    var search2 = document.getElementById('searchTerm_en');
    var matchList = document.getElementById('result');

    var searchStates = async searchText => {
        var res = await fetch('../data/info.json');
        var states = await res.json();

        let matches = states.filter(state => {
            var regex = new RegExp(`^${searchText}`,'gi');
            return state.name.match(regex);
        });

        if(searchText.length === 0){
            matches = [];
            matchList.innerHTML = '';
        }
        outputHtml(matches);
    };

    var outputHtml = matches => {
       if(matches.length > 0){
            var html = matches.map(match =>
                `<div class="card result-list de en">
                   <h6><span class="my-result"><a href="${match.url}" target="_blank">${match.name}</a> </h6></span>
               </div>
`).join('');

                matchList.innerHTML = html;
            }
        };
        search.addEventListener('input', () => searchStates(search.value));
        search2.addEventListener('input', () => searchStates(search2.value));
    </script>

普通的 JS 函数(我从箭头函数创建的)

<script>

    var search = document.getElementById('searchTerm_de');
    var search2 = document.getElementById('searchTerm_en');
    var matchList = document.getElementById('result');

    var searchStates = async function searchStates (searchText) {
        var res = await fetch('../data/info.json');
        var states = await res.json();
        var matches = states.filter(function (state) {
            var regex = new RegExp("^".concat(searchText), "gi");
            return state.name.match(regex);
        });

        if (searchText.length === 0) {
            matches = [];
            matchList.innerHTML = '';
        };

        outputHtml(matches);
    };

    var outputHtml = function (matches) {
        if (matches.length > 0) {
            var html = matches.map(function (match) {
                return "<div class=\"card result-list de en\">\n\t\t<h6><span class=\"my-result\"><a href=\"".concat(match.url, "\" target=\"_blank\">").concat(match.name, "</a> </h6></span>\n\t</div>\n\t");
            }).join('');
            matchList.innerHTML = html;
        }
    };

    search.addEventListener('input', function () {
        return searchStates(search.value);
    });
    search2.addEventListener('input', function () {
        return searchStates(search2.value);
    });

</script>

JSON 文件

[
    {
        "name":"Running ",
        "url": "url": "http://google.com"
    },
    {
        "name":"Javascript",
        "url": "url": "http://google.com"
    },
    {
        "name":"On old browser",
        "url": "url": "http://google.com"
    },
    {
        "name":"without arrow",
        "url": "url": "http://google.com"
    },
    {
        "name":"functions and works well",
        "url": "http://google.com"
    },
    {
        "name":"Please, help me",
        "url": "url": "http://google.com"
    },
    {
        "name":"I gladyl appreciate your response",
        "url": "url": "http://google.com"
    },
]

我已更改箭头功能,但我注意到 IE 11 不支持 Await/Async。有没有人可以使此代码在 IE.11 上运行。所有帮助和帮助将不胜感激

谢谢

编辑

我已经可以使用 Babel 转译器了:https://babeljs.io/docs/en/babel-plugin-transform-async-to-generator/

这是我的 HTML

              <div class="search">
              <input type="text" class="searchTerm de" id="searchTerm_de" placeholder="Was suchst du ?" onfocus="this.placeholder=''" onblur="this.placeholder='Was suchst du ?'">
              <input type="text" class="searchTerm en" id="searchTerm_en" placeholder="What are you looking for ?" onfocus="this.placeholder=''" onblur="this.placeholder='What are you looking for ?'">
          </div>
              <ul class="list-group-search" id="result"></ul>
              <br/>
          </div> ```

**and this is the transpiled/compiled ES5 for IE 11**


     <script>

            function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error);
          return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

      function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args
      ); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

      var search = document.getElementById('searchTerm_de');
      var search2 = document.getElementById('searchTerm_en');
      var matchList = document.getElementById('result');

      var searchStates =  function () {
              var _ref = _asyncToGenerator(function* (searchText) {
                  var res = yield fetch('./data/info.json');
                  var states = yield res.json();
                  let matches = states.filter(function(state) {
                      var regex = new RegExp(`^${searchText}`, 'gi');
                      return state.name.match(regex);
                  });

                  if (searchText.length === 0) {
                      matches = [];
                      matchList.innerHTML = '';
                  }

                  outputHtml(matches);
              });

              return function searchStates(_x) {
                  return _ref.apply(this, arguments);
              };
          }();

      var outputHtml =function(matches) {
          if (matches.length > 0) {
              var html = matches.map(match => `<div class="card result-list de en">
              <h6><span class="my-result"><a href="${match.url}" target="_blank">${match.name}</a> </h6></span>
      </div>
      `).join('');
              matchList.innerHTML = html;
          }
      };

      search.addEventListener('input', () => searchStates(search.value));
      search2.addEventListener('input', () => searchStates(search2.value));

      </script>

While the JSON file still remains the same.

It's still working on all browsers except IE 11.

Its gettings tiring but I'm not determined to give up

Anyone else knows what could be done at this point to make the code run on IE 11

Thanks

【问题讨论】:

  • await, async,ES5 不支持模板字面量和箭头函数。箭头函数与function(){} 非常相似。模板文字可以替换为:"..." + variable1 + "..." + variable2asyncawait 需要替换为 Promises(或 polyfill)
  • 你需要babel
  • @VishnuBhadoriya 我也使用了 babel,但错误仍然存​​在。你能帮我看看这段代码吗?谢谢
  • @nickzoum 感谢您的快速回复。那么,你有什么建议我改变代码谢谢
  • @AdenijiOlasunkanmi 如果您的错误与异步有关,请在 babel 中查看,然后参考此link

标签: javascript json async-await


【解决方案1】:

查看link

我使用 babel repl 生成 IE 兼容代码。您应该按照@David Barshav 提到的说明进行操作,但您需要正确配置您的 babel 以使用 IE 11。您还应该检查 preset-env 的 babel。

编辑:下面的代码只是一个可行的 javascript 版本。 但是 缺少的部分是fetch IE 11 不支持。您必须为此使用 polyfill 或使用 XHR 请求或使用简化 XHR 请求的库(如 jquery)。

Github Fetch poyfill。 BluebirdPromisepolyfill。

生成的代码:

var search = document.getElementById('searchTerm_de');
var search2 = document.getElementById('searchTerm_en');
var matchList = document.getElementById('result');

var searchStates = function searchStates(searchText) {
  var res, states, matches;
  return regeneratorRuntime.async(function searchStates$(_context) {
    while (1) {
      switch (_context.prev = _context.next) {
        case 0:
          _context.next = 2;
          return regeneratorRuntime.awrap(fetch('../data/info.json'));

        case 2:
          res = _context.sent;
          _context.next = 5;
          return regeneratorRuntime.awrap(res.json());

        case 5:
          states = _context.sent;
          matches = states.filter(function (state) {
            var regex = new RegExp("^".concat(searchText), "gi");
            return state.name.match(regex);
          });

          if (searchText.length === 0) {
            matches = [];
            matchList.innerHTML = '';
          }

          ;
          outputHtml(matches);

        case 10:
        case "end":
          return _context.stop();
      }
    }
  });
};

var outputHtml = function outputHtml(matches) {
  if (matches.length > 0) {
    var html = matches.map(function (match) {
      return "<div class=\"card result-list de en\">\n\t\t<h6><span class=\"my-result\"><a href=\"".concat(match.url, "\" target=\"_blank\">").concat(match.name, "</a> </h6></span>\n\t</div>\n\t");
    }).join('');
    matchList.innerHTML = html;
  }
};

search.addEventListener('input', function () {
  return searchStates(search.value);
});
search2.addEventListener('input', function () {
  return searchStates(search2.value);
});

【讨论】:

  • 我打算建议使用 TypeScript/bable 编译器(你打败了我)
  • 嗨@dbones 我仍然有问题..你能进一步解释吗?
  • @AdenijiOlasunkanmi 你能解释一下你遇到的问题吗?给出详细的错误等。
  • 嗨@Eldar 感谢您愿意帮助新手开发人员。我一直在这个平台上使用代码,它没有从 JSON 文件中获取数据。你能在这里查看链接吗:jsbin.com/fiwoqaveje/edit?html,js,output
  • @AdenijiOlasunkanmi 您的请求实际上已被阻止。因为您正在从 https 发出 http 请求。而且您的 api 提供应该允许 CORS,您还应该添加您的请求 cors 标头。
【解决方案2】:

要在 IE 11 中启用对 async 的支持,您需要确保在页面中包含 Regenerator Runtime。这可以直接加载,也可以通过babel-transform-runtime 包含在内。

【讨论】:

  • 嗨@David,感谢您的回复。我已经使用 babel 转译器/编译器重新生成了代码,但它仍然是一样的。没有变化!
  • 我猜他们是你的 Babel 配置中缺少的东西。你上面的代码看起来很好,如果 Babel 设置正确,应该可以工作。
【解决方案3】:

最简单的方法是使用 bable 并指定使用 IE11 的预设

.bablerc

{
  "presets": [
    ["env", {
      "targets": {
        "browsers": ["last 2 versions", "ie >= 11"]
      },
        "useBuiltIns": true
    }],

  ]
}

并使用带有标志--presets babel-preset-es2015-ie的CLI

使用bable在线测试仪

Bable Tester

【讨论】:

  • 嗨@Martin 感谢您愿意帮助新手开发人员。我一直在这个平台上使用代码,它没有从 JSON 文件中获取数据。你能在这里查看链接吗:jsbin.com/fiwoqaveje/edit?html,js,output
  • 您好,请在此处找到未转译的代码:jsbin.com/lovimapaca/1/edit?html,js,output
  • 以上代码在 Chrome、Mozilla 和 Internet Edge 中有效,但在 IE.11 上无效
  • 在 bable 中添加了设置链接 为您在线尝试,这似乎与 IE 11 兼容。
【解决方案4】:

我刚刚使用 babel 预设、运行时和重新生成器转换为旧版本,它可以在 IE 中工作。

var search = document.getElementById('searchTerm_de');
var search2 = document.getElementById('searchTerm_en');
var matchList = document.getElementById('result');

var searchStates = function searchStates(searchText) {
  var res, states, matches;
  return _regenerator.default.async(function searchStates$(_context2) {
    while (1) {
      switch (_context2.prev = _context2.next) {
        case 0:
          _context2.next = 2;
          return _regenerator.default.awrap(fetch('../data/info.json'));

        case 2:
          res = _context2.sent;
          _context2.next = 5;
          return _regenerator.default.awrap(res.json());

        case 5:
          states = _context2.sent;
          matches = states.filter(function (state) {
            var regex = new RegExp("^".concat(searchText), 'gi');
            return state.name.match(regex);
          });

          if (searchText.length === 0) {
            matches = [];
            matchList.innerHTML = '';
          }

          outputHtml(matches);

        case 9:
        case "end":
          return _context2.stop();
      }
    }
  });
};

var outputHtml = function outputHtml(matches) {
  if (matches.length > 0) {
    var html = matches.map(function (match) {
      return "<div class=\"card result-list de en\">\n               <h6><span class=\"my-result\"><a href=\"".concat(match.url, "\" target=\"_blank\">").concat(match.name, "</a> </h6></span>\n           </div>\n");
    }).join('');
    matchList.innerHTML = html;
  }
};

search.addEventListener('input', function () {
  return searchStates(search.value);
});
search2.addEventListener('input', function () {
  return searchStates(search2.value);
});

我正在使用presets 将此代码从asyn 转换为IE!如果它不起作用,请告诉我们,以便我们更好地为您提供帮助!

编码愉快!

【讨论】:

  • 您好@bloodyLogic,感谢您的帮助。我也使用 babel/plugin-transform-async-to-generator 尝试了这种方法。它为我产生了相同的结果,但仍然无法正常工作。你能从你这边确认吗?谢谢
  • 再次感谢.. 我的公司仍在使用 IE 11。不知道为什么,但一直如此。因此,我需要在 IE 11 上进行这项工作。您还有什么建议?
  • 用像 ec15,17 这样的脚本尝试 babel,并尝试控制台错误在哪里,找出尝试解决您自己的问题或在这里与我们分享!
  • 当然,我正在尝试这样做.. 完成我的发现后将在这里分享结果再次感谢您的支持
  • 此代码不能在 IE 上运行。它有生成器函数、箭头函数。 IE 不支持function* (searchText)() =&gt; searchStates(search.value)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2021-10-19
  • 1970-01-01
  • 2018-11-12
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多