Object.assign 的问题
功能及问题
如下代码,
使用用户最后一次配置信息的同时,当用户关闭数据记录时提示用户确定关闭。
export default {
name: 'editPage',
data() {
return {
page: {},
fpSettings: {},
settingApiOk: false,
}
},
watch: {
fpSettings: {
handler(newVal) {
let pageSettings = this.page.settings || {}
if(this.settingApiOk && newVal.trace === false && pageSettings.trace === true) {
this.$dialog.confirm({
message: '确定关闭吗?',
cancelButtonText: '暂不',
confirmButtonText: '确定',
}).then(() => {
console.log('确定')
}).catch(() => {
console.log('暂不')
newVal.trace = true
})
}
this.page.settings = {...pageSettings, ...newVal}
},
deep: true,
},
},
mounted() {
http.get(`fppage/lastSetting`).then(({ settings: lastSettings } = {}) => {
http.get(`fppage/setting`).then((settings = {}) => {
this.fpSettings = Object.assign(this.fpSettings, lastSettings, settings.settings)
this.settingApiOk = true
})
})
}
}
现在有一个 bug , 在手机上, 如果选项为关闭, 刷新时会直接弹出提示窗口, 正确情况是只应该在用户设置的时候弹出。在电脑上把网速调为 Fast 3G 以下会重现。
经测试, 如果不使用 fppage/lastSetting 这个请求直接是正常的。
但 setting 是写在 lastSetting 的回调 then 中的, 应该他两不存在干扰问题呀。
但还是猜想有没有可能虽然写了 then ,他们依然可能同时发出请求, 同时接收到数据。
并且使用了一个 settingApiOk 变量来判断接口是否请求完成, 然而问题依旧。
改为同步方式
试图使用 async / await 异步转为同步的方法, 把 mounted 中的代码抽取 methods 中。
貌似与之前的代码也没什么不同。确实, 问题依旧。
逐步 debugger , 确定是一个接口一个接口的请求完, 代码一行一行的走的哇。
async intSetting () {
const lastSettings = await this.$http.get(`fppage/lastSetting`)
const setting = await this.$http.get(`fppage/setting`)
this.fpSettings = Object.assign(this.fpSettings, lastSettings, setting.settings)
this.settingApiOk = true
},
干脆再加个 await 吧
看上面的代码都在前面加了 await 也都没有用, 那索性再在 Object.assign() 前面加一个试试吧。
尼玛居然成功了, 完全想不到是这个原因。 难道 Object.assign 是一个异步方法吗?傻傻分不清。
换个 … 试试
Object.assign() 和 ... 都是对象合并的方法。那换个 ... 试试呢?
// this.fpSettings = await Object.assign(this.fpSettings, lastSettings, setting.settings)
this.fpSettings = await {...this.fpSettings, ...lastSettings, ...setting.settings}
很遗憾, 使用 ... 方式加 await 也不能解决问题。那么看来它和 Object.assign() 还是有区别的。那么区别是什么呢?
疑问
通过上面的情况, 有几个问题存在。
Object.assign()是一个异步操作吗?为什么加await就好了?Object.assign()和...有什么不同?
Object.assign 的问题的更多相关文章
- Object.assign方法复制或合并对象
Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象 var obj = { a: 1 }; var copy = Object.assign({ ...
- Object.assign()方法
对象的扩展 1.ES6中,对象的属性和方法可简写:对象的属性值可不写,前提是属性名已经声明: var name = "zhangsan"; "; var obj = { ...
- 微信不支持Object.assign
微信不支持Object.assign,让我Vue怎么用QAQ... 解决方法: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...
- object.assign()方法的使用
地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
- [Javascript] Object.assign()
Best Pratices for Object.assign: http://www.cnblogs.com/Answer1215/p/5096746.html Object.assign() ca ...
- [Redux] Avoiding Object Mutations with Object.assign() and ...spread
Learn how to use Object.assign() and the spread operator proposed for ES7 to avoid mutating objects. ...
- [ES6] Object.assign (with defaults value object)
function spinner(target, options = {}){ let defaults = { message: "Please wait", spinningS ...
- Object.assign()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign 说明 Ob ...
- 学习Object.assign()
Object.assign()用于将所有可枚举的值从一个或多个源对象复制到目标对象.它将返回目标对象. 语法 Object.assign(target, ...source); var obj = { ...
- es6 Object.assign
ES6 Object.assign 一.基本用法 Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target).它至少需要两个对象作为参数,第一个参数是目 ...
随机推荐
- weblogic反序列化漏洞CVE-2018-2628-批量检测脚本
#coding=utf-8 import socket import time import re,os,sys,codecs type = 'utf-8' reload(sys) sys.setde ...
- sshfs远程挂载
一.什么是 SSHFSSSHFS(Secure SHell FileSystem)是一个客户端,可以让我们通过 SSH 文件传输协议(SFTP)挂载远程的文件系统并且在本地机器上和远程的目录和文件进行 ...
- 关于Vue懒加载问题
有关Vue懒加载其实并不是想象的那么难和复杂: 首先引入 import VueLazyLoad from 'vue-lazyload'; 其次是使用 Vue.use(VueLazyLoad,{ er ...
- 补充:MySQL整理
1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...
- Android 四大布局属性介绍
线性布局 控件距离布局底,左,右,顶部部的距离 android:paddingBottom="35.0dip" android:paddingLeft=" ...
- WebDriver API--元素定位
WebDriver属于Selenium体系中设计出来操作浏览器的一套API, 站在WebDriver的角度, 因为它针对多种编程语言都实现了一遍这套API,所以它可以支持多种编程语言: 站在编程语言的 ...
- debian使用nginx创建静态文件存储
vim /etc/nginx/sites-available/default 在server下添加 location ~ .*\.(gif|jpg|jpeg|png)$ { expires 24h; ...
- eclipse maven引入第三方jar包后如何下载源代码(sources)
1. 在eclipse windows -> properties->maven 选项,然后查看右侧 菜单来中 找到 Download Artifact Sources 选项勾选:如果想 ...
- PHP Echarts Ajax Json柱形图示例
<?php $server = '127.0.0.1'; $user = 'root'; $password = ''; $database = 'yiibaidb'; $conn = new ...
- 【学习笔记】Tensorflow+Inception-v3训练自己的数据
导读 喵喵的,一个大坑.本文分为吐槽和干货两部分. 一.吐槽 大周末的,被导师扣下加班,嗨气,谁叫本狗子太弱鸡呢,看起来很简单的任务倒腾了两天还没完,不扣你扣谁? 自己刚接到微调Inception-v ...