使用 Javascript 中的多个承诺更新通用全局数据结构
Updating a common global data-structure using multiple promises in Javascript
考虑以下代码:
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;
应该怎么做才能确保 Promise 获取旧数组或获取较新数组?换句话说,我如何确保更改全局数据结构的 coreFunc (Promise0) 中的代码受到保护?
您的代码中存在一些问题。
var globalList = Array();
- 此处缺少新关键字。
var localList = globalList;
- 这不会创建数组的副本,它只会创建对外部数组的引用。所以无论你在 localList 中改变什么,在 globalList 中也会改变。试试这个:var localList = [...globalList];
。这会创建一个(浅)副本。
globalList = testList;
- 此处相同。
可以找到关于按值传递与按引用传递的很好的读物here。
- 无限循环是由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));
考虑以下代码:
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;
应该怎么做才能确保 Promise 获取旧数组或获取较新数组?换句话说,我如何确保更改全局数据结构的 coreFunc (Promise0) 中的代码受到保护?
您的代码中存在一些问题。
var globalList = Array();
- 此处缺少新关键字。var localList = globalList;
- 这不会创建数组的副本,它只会创建对外部数组的引用。所以无论你在 localList 中改变什么,在 globalList 中也会改变。试试这个:var localList = [...globalList];
。这会创建一个(浅)副本。globalList = testList;
- 此处相同。
可以找到关于按值传递与按引用传递的很好的读物here。
- 无限循环是由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));