javascript - 如何在异步函数之间共享变量?
问题描述
我是 React-Native 的新手,我对如何拥有一个可以由文件中的所有函数访问的变量而不是在一个类中感到困惑。
我的问题是我在 taskFour() 中分配了存储空间,并且我希望在 runDemo() 中返回该值,但是由于某种原因,当我在 runDemo() 中的 console.log(storage) 中返回未定义时!
我已经定义了一个帮助文件,其中包含一堆相互调用的函数。
助手.js
import React from 'react';
import SQLite from 'react-native-sqlite-storage';
let db;
let storage;
function runDemo() {
loadAndQueryDB();
//Suppose to return value assigned in queryPeopleSuccess but console logs 'undefined'
console.log(storage);
return storage;
}
// Sends an update saying that Database was successfully opened
function openCB() {
console.log("Success Opening DB");
}
// Sends an update with error message and returns FALSE
function errorCB(err) {
console.log("SQL Error: ", err);
return false;
}
/** 2. Called when runDemo is called **/
/* assigns variable 'db' to opened Database */
/* Calls queryPeople(db) */
function loadAndQueryDB() {
console.log("Opening Database...: ");
db = SQLite.openDatabase({ name: "users.db", createFromLocation: 1}, openCB, errorCB);
queryPeople(db);
}
/** 3. Called when loadAndQueryDB is called **/
/* Get the DB and applies a SQL call that if successful will call queryPeopleSuccess*/
function queryPeople(db) {
console.log("Executing employee query...");
//Execute a database transaction.
db.transaction((tx) => {
tx.executeSql('SELECT * FROM users', [], queryPeopleSuccess, errorCB);
});
}
function queryPeopleSuccess(tx, results) {
var len = results.rows.length;
let localArray = [];
//Go through each item in dataset
for (let i = 0; i < len; i++) {
let row = results.rows.item(i);
localArray.push(row);
}
storage = localArray;
}
export {
runDemo,
}
我认为通过在函数之外分配“存储”可以使其成为该文件中所有函数可访问的变量,而不使其成为全局变量。此外,我的一个限制是我不能从 queryPeopleSuccess 一路返回存储到 runDemo,因为这些函数中的函数不应该有返回值!
有人可以指出我如何在一个文件中拥有一个变量,而该变量不需要在一个可以由该文件中的函数访问和编辑的类中?
已编辑:为清晰和错别字而编辑。原来我的代码的问题是由于异步!
解决方案
您的问题与Javascript中的异步有关。
您当前的程序(脚本)使用同步机制从上到下执行,并且您没有value
为您的变量分配任何初始值storage
。所以函数runDemo
返回默认值undefined
。
要解决您的问题,您需要将您的转换runDemo
为异步函数。
let storage;
async function runDemo() {
await taskOne();
//Suppose to return value assigned in taskFour but console logs 'undefined'
console.log(storage);
return storage;
}
function taskOne() {
taskTwo();
}
function taskTwo() {
taskFour();
}
let localArray = 20;
function taskFour() {
storage = localArray;
//Here storage is assigned properly and outputs the data I want
console.log(storage);
}
runDemo()
推荐阅读
- java - 如何使用 Java 中的 Firestore 中的数据创建饼图
- javascript - 如何将一个脚本的输出传递到 javascript 中的弹出 url?
- python - 将本地计算机时钟与 NTP 时间同步
- python - 如何强制 python matplotlib 到轴进行线性缩放?
- javascript - 我想将一些代码从代码笔切换到 Visual Studio 代码
- networking - 计算与链接节点的交互 [netlogo]
- java - 如何判断一个反应是否被使用 JDA 的不和谐机器人删除?
- image-processing - 未考虑 Thumbor focus() 过滤器
- mysql - Mysql 计算 Sum(if()) 中的不同 ID
- c# - 使用 BeginInvoke 触发的事件会引发异常,但如果使用 Invoke 触发则不会