React Native 如何从端点获取脚本并将其用作请求响应?

1szpjjfi  于 2023-03-31  发布在  React
关注(0)|答案(1)|浏览(200)

我正在做一个项目,我们需要从一个端点消费一个脚本。是的,我们将要消费的API是为web构建的。所以,事情是端点返回一个脚本,这是一个设置变量的自调用函数。请求内容类型头是application/javascript,我想从端点获得结果,并在应用程序中使用该变量。
我将给予一个更直接的例子。
假设我们有以下脚本:

const Script = (() => {
  return {
    some: "method",
    another: "method",
  };
})();

该脚本从端点返回,将在Web浏览器中使用,如下所示。

<script src="https://example.com/index.js"></script>

但我希望在我的React Native应用程序中使用该脚本/变量,如下所示。

fetch("https://example.com/index.js", { method: "GET" }).then((response) => {});

问题是,对请求的响应不是我需要的,我可以将其转换为Blob,但如何将Blob解析为js函数或类似的东西呢?

2eafrhcq

2eafrhcq1#

解决方案是通过使用Function完成的,Function在内部使用eval
由于返回的脚本是一个Blob,即存储在请求结果中(在我的例子中,它在_bodyBlob内部,但我认为它可能会因后端而异),我可以将Blob转换为字符串,有一些方法可以做到这一点。我的方法是使用我的Blob创建一个Response示例,然后在其中使用text方法。
加载字符串后,脚本本身就是一个自调用函数,它设置了一个变量,因此我需要编辑字符串来创建一个函数,该函数返回所定义的变量。
在此之后,我只需要创建一个函数并执行它来将所需的对象返回到变量中。

fetch("https://example.com/index.js", { method: "GET" }).then((response) => {
  new Response(response._bodyBlob).text().then((text) => {
    const modifiedString = `${text}; return Script`;

    const scriptObject = new Function(modifiedString)();
    ...
  });
});

相关问题