如何解决使用JavaScript中的多个Promise更新通用的全局数据结构
考虑以下代码:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve,ms));
}
var globalList = Array();
globalList[0] = "Test";
globalList[1] = "Another Test";
async function coreFunc(promiseName,sleepTime) {
console.log("Started CoreFunc: "+promiseName);
var localList = globalList;
console.log("Length of local array: "+localList.length);
console.log("Length of global array: "+globalList.length);
if (promiseName != "Promise0") {
for (i = 0; i < localList.length; i++) {
console.log(localList[i]);
}
}
if (promiseName == "Promise0") {
var testList = new Array();
testList[0] = "Changed";
globalList = testList;
}
await sleep(sleepTime);
console.log("Length of local array: "+localList.length);
console.log("Length of global array: "+globalList.length);
console.log("Done with CoreFunc: "+promiseName);
}
async function testMultiplePromises() {
var thArray = Array();
for (i = 0; i < 4; i++) {
var pr = new Promise(resolve => coreFunc("Promise" + i,3000));
thArray[i] = pr;
}
for (i = 0; i < thArray.length; i++) {
await thArray[i];
}
}
globalList是一个全局数组。当上述代码被调用时,如下所示:
await testMultiplePromises();
代码进入无限循环。问题肯定在以下部分中,在该部分中,我将全局变量重新初始化为一些不同的数组:
if (promiseName == "Promise0") {
var testList = new Array();
testList[0] = "Changed";
globalList = testList;
}
是否有一种方法可以将全局数据结构复制到局部变量,而不会导致索引超出范围或出现无限循环之类的问题?以下代码绝对不能完成任务:
var localList = globalList;
为了确保Promises获得旧的阵列或获得新的阵列,应该怎么做?重新说明一下,如何确保coreFunc(Promise0)内部更改全局数据结构的代码受到保护?
解决方法
- 无限循环是由for循环上的全局
i
变量引起的。您应该这样输入
...
for (var i = 0; i < localList.length; i++) {
...
for (var i = 0; i < 4; i++) {
...
for (var i = 0; i < thArray.length; i++) {
...
- 要“保护”阵列,您可以像这样复制它
var localList = JSON.parse(JSON.stringify(globalList));
,
您的代码中有一些问题。
-
var globalList = Array();
-此处缺少新关键字。 -
var localList = globalList;
-这不会创建数组的副本,而只是创建对外部数组的引用。因此,在localList中所做的任何更改也将在globalList中进行更改。试试这个:var localList = [...globalList];
。这将创建一个(浅)副本。 -
globalList = testList;
-此处相同。
可以很好地了解按值传递与按引用传递的关系here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。