利用引用变量的方式解决同步异步问题
下面使用新的示例,因为字符串不是使用引用的方式,需要将字符串包裹在对象中才起作用。先看正常的示例:
function req(obj) {
return new Promise((resolve, reject) => {
resolve(obj)
})
}
function update(data) {
req(data).then(result => {
obj = result;
console.log("结果3:",obj);
});
console.log("结果1:",obj);
}
let obj = {
msg: "你好"
};
update({
msg: "hello"
});
console.log("结果2:",obj);
结果:
分析:不用多说,代码执行顺序为:代码3、4、2、5、1。执行代码2和5时,obj其实是一个引用,因此这两个结果是一样的,但是,赋值使用obj = result,结果2之前将obj引用到了新的对象,因此执行结果2最后和之前不一样。
问题:怎么样才能将结果1和结果2的值和结果3是一样的呢?
方案:这是赋值的问题,因此obj = result的意思是将obj指向了新的引用对象,之前的丢弃。所以在赋值的时候,不要丢弃之前的对象,只是做修改对象内部属性的值,那么不管再哪里引用都是一样的值了。
function req(obj) {
return new Promise((resolve, reject) => {
resolve(obj)
})
}
function update(data) {
req(data).then(result => {
obj.msg = result.msg;
console.log("结果3:",obj);
});
console.log("结果1:",obj);
}
let obj = {
msg: "你好"
};
update({
msg: "hello"
});
console.log("结果2:",obj);
结果:
分析:如结果所示,最后的数据为实时的数据,但是上面的打印数据是代码执行时的值,而我们平时调用获取值时,都是使用引用来获取变量的实时数据。这种方式没有改变代码执行的顺序,也没有改变异步和同步的方式,只是改变了赋值方式。这种方式在父方法不能为异步方法时,很有效。再次强调,如果为基本类型,包装在一个对象或数组的应用下才有效。