0

我正在尝试将一个成员数据数组加载到一个 javascript 变量中,以便我可以从几个不同的函数中对其进行操作。在给它旧的大学尝试之后,我迷路了。

我了解异步函数的必要性,以免阻塞主线程,但我能够填充全局变量的唯一方法是将函数结果存储到 session.Storage,然后从那里在其他函数中调用它。虽然这可行,但它似乎是一个额外的步骤。

    async function fetchMember($vid) {

    let options = {
        method: 'POST',
        async:false,
        body: JSON.stringify({vid: $vid}),
        headers: {
            'Content-Type': 'application/json',  // sent request
            'Accept': 'application/json'   // expected data sent back
        },
    }
    let response = await fetch('getMember.php', options);
    let $member = await response.text();
    sessionStorage.setItem("member", $member)
     return ($member); // this is a promise because it is in an async function

} //end of function


fetchMember("999999").then ($dog=> console.log ("Then = " + $dog))// $dog is a promise

console.log ("Member = " + $member);  // undefined
$member = session.Storage ("member")  // work as expected

我可以“ .then ”将承诺的结果记录到控制台,但对于我来说,我无法弄清楚如何将它存储在全局变量中。

4

1 回答 1

0

正如@epascarello 所提到的,您不会从then区块中返回您的承诺。一个简单的(也许是hacky)解决方案可能是将您的程序包装在一个异步函数中,然后await是来自您的 fetchMember 函数的响应。我在实践中用这个做了一个简单的 jsFiddle。

它并不完美,但它应该可以帮助您到达需要去的地方!

JsFiddle:https ://jsfiddle.net/3q98gx2t/

(async () => {

// Get the data out of the fetchMember function
// It is in the scope of the overall self executing function.

let test = await fetchMember();

async function fetchMember($vid) {

  let options = {
    method: 'GET',
  }
  let response = await fetch('https://api.coindesk.com/v1/bpi/currentprice.json', options);
  let $member = await response.text();

  return $member; // this is a promise because it is in an async function

} //end of function

console.log("Member = " + test);  // undefined

})();

整个then/catch系统的问题在于它总是会返回一个承诺,因此,根据你的项目,你最终会陷入一个长长的.then(data => something).then(data => something).

对于这个例子,我使用了对比特币 API 的 GET 请求,但原理仍然存在。只需将您的选项交换回来,它应该可以工作。

如您所见,我已删除会话存储调用。

于 2020-08-19T17:49:07.497 回答