Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步TS/JS函数中的全局赋值是否安全,不会意外重写现有值?_Javascript_Typescript_Async Await - Fatal编程技术网

Javascript 异步TS/JS函数中的全局赋值是否安全,不会意外重写现有值?

Javascript 异步TS/JS函数中的全局赋值是否安全,不会意外重写现有值?,javascript,typescript,async-await,Javascript,Typescript,Async Await,我有一个并行执行的查询列表,结果需要分配给2D HashMap 因为它是一个2D HashMap,所以键可能不存在,并且可能需要先创建,但是下面的代码在所有情况下都是安全的吗?或者,在某些情况下,赋值可能会覆盖另一个查询的结果,而该查询只在一点点之前完成 results:Record={}; 异步searchAll(查询:字符串[]){ 等待Promise.all(querys.map)(异步(查询)=>{ //网络行动 const result=等待搜索(查询); //如果密钥尚不存在,请创建

我有一个并行执行的查询列表,结果需要分配给2D HashMap

因为它是一个2D HashMap,所以键可能不存在,并且可能需要先创建,但是下面的代码在所有情况下都是安全的吗?或者,在某些情况下,赋值可能会覆盖另一个查询的结果,而该查询只在一点点之前完成

results:Record={};
异步searchAll(查询:字符串[]){
等待Promise.all(querys.map)(异步(查询)=>{
//网络行动
const result=等待搜索(查询);
//如果密钥尚不存在,请创建该密钥
//result.otherKey不包含重复项
(this.results[result.key]??(this.results[result.key]={}))[result.otherKey]=result.value;
}));
}
我猜第二个问题取决于第一个问题的答案,我如何在不等待所有查询的情况下同步第二部分

编辑:
由于注释,显然JS是按顺序执行的,因此在下一个
返回
/
等待
之前的任何操作都将单独执行,这将使代码安全,也就是说,不可能存在两个
异步
函数具有相同的
值的情况,并同时创建一个新的映射,这样其中一个结果就会被忽略。

返回wait Promise.all并返回结果。将其简化为您需要的格式

result=(wait searchAll(query)).reduce((o,r)=>(o[r.key]={…o[r.key],[r.otherKey]:r.value},o),{})

这样的方法应该行得通。我没有尝试代码,而且我忘记了类型,所以可能需要修复。但对我来说,这样看起来更安全。
这样,所有查询都将完成,然后根据所有承诺的结果生成矩阵。

这根本不安全,当您有条件地创建要无条件分配的密钥时,如果
result.key
result.otherKey
对于多个结果都是相同的,则为LWW。要想知道什么时候从全局变量中读取数据是“安全的”,这也是为什么没有人将全局变量用于异步操作的原因。使用类似于
Promise.all
Promise.allSettled
的方法来协调逻辑。问题是是否可能存在重复的“otherKey”值,如果是,那么期望的行为是什么?先到先得?是的,我没有正确指定,在我的情况下,不会有重复的
otherKey
值。需要注意的是,如果1)检查密钥是否存在,然后2)如果密钥不存在,则立即分配它,那么就不会有问题。即使在异步上下文中,同步代码也始终是同步的。换句话说,在
等待搜索(查询)
之后,在该函数结束之前的所有操作都将按照您的预期进行。1)您无法检查键是否存在,2)循环中的另一个异步函数无法为该键分配对象,3)原始函数无法将默认结果键设置为
{}
。不过,上面的其他注释仍然适用。好的,谢谢,我想这回答了我的问题,如果JS只在
await
关键字处暂停函数,但在其他任何代码执行之前,总是保证函数执行到结尾(或下一个
await
),那么代码应该像我预期的那样工作!