功能及问题

如下代码,

使用用户最后一次配置信息的同时,当用户关闭数据记录时提示用户确定关闭。

  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() 还是有区别的。那么区别是什么呢?

疑问

通过上面的情况, 有几个问题存在。

  1. Object.assign() 是一个异步操作吗?为什么加 await 就好了?
  2. Object.assign()... 有什么不同?

Object.assign 的问题的更多相关文章

  1. Object.assign方法复制或合并对象

    Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象 var obj = { a: 1 }; var copy = Object.assign({ ...

  2. Object.assign()方法

    对象的扩展 1.ES6中,对象的属性和方法可简写:对象的属性值可不写,前提是属性名已经声明: var name = "zhangsan"; "; var obj = { ...

  3. 微信不支持Object.assign

    微信不支持Object.assign,让我Vue怎么用QAQ... 解决方法: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...

  4. object.assign()方法的使用

    地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

  5. [Javascript] Object.assign()

    Best Pratices for Object.assign: http://www.cnblogs.com/Answer1215/p/5096746.html Object.assign() ca ...

  6. [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. ...

  7. [ES6] Object.assign (with defaults value object)

    function spinner(target, options = {}){ let defaults = { message: "Please wait", spinningS ...

  8. Object.assign()

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign 说明 Ob ...

  9. 学习Object.assign()

    Object.assign()用于将所有可枚举的值从一个或多个源对象复制到目标对象.它将返回目标对象. 语法 Object.assign(target, ...source); var obj = { ...

  10. es6 Object.assign

    ES6 Object.assign 一.基本用法 Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target).它至少需要两个对象作为参数,第一个参数是目 ...

随机推荐

  1. vue-cli创建第一个项目(用git bash解决上下键移动选择问题)

    我电脑是windows:(nodejs已经有了) 1 下载vue-cli cmd 打开命令行,或者是gitbash.最好是用cnpm比较快. 2   创建项目: dos命令,cd 你的希望创建的文件夹 ...

  2. C++ string中find() 用法

    string中 find()的用法 rfind (反向查找)  (1)size_t find (const string& str, size_t pos = 0) const;  //查找对 ...

  3. 怎么在Centos7 下让我的mariadb开机启动?(已解决)

    以前我经常使用syscemctl工具在开机后执行 systemctl start mariadb (哈哈,打得可6,只是有点儿麻烦), 如果能开机自启动mariadb就好了. 所以,我想百度下看什么命 ...

  4. js的小知识7

    1.函数都有返回值...... 而方法的本质也是函数,所有也有返回值. Document.getElementById()返回的是获取的标签 getElementByClassName()和getEl ...

  5. Synctoy2.1使用定时任务0X1

    环境描述:公司需要在windows上面使用双向文件同步,目前发现SyncToy可以实现这个功能,但是在Windows 2012上面 ,添加定时任务的时候,执行状态总是0x1,定时任务配置确认多次,肯定 ...

  6. python全栈开发 * 03 基本数据类型 * 180601

    python基本数据类型  ( int , bool , str ) 一  python基本数据类型    (一)int ==> 整数.进行数学运算     (二)str ==> 字符串. ...

  7. 二叉查找树,AVL树,伸展树【CH4601普通平衡树】

    最近数据结构刚好看到了伸展树,在想这个东西有什么应用,于是顺便学习一下. 二叉查找树(BST),对于树上的任意一个节点,节点的左子树上的关键字都小于这个节点的关键字,节点的右子树上的关键字都大于这个节 ...

  8. 【模拟与阅读理解】Gym - 101954C Rullete

    http://codeforces.com/gym/101954/problem/C 题意:14行伪代码让你翻译. 坑得yibi #include<stdio.h> #include< ...

  9. python ssh之paramiko模块使用

    1.安装: sudo pip install paramiko 2.连接到linux服务器 方法一: #paramiko.util.log_to_file('ssh.log') #写日志文件 clie ...

  10. 10大必备的Intellij插件,大幅提高你的工作效率

    转自: https://blog.csdn.net/qq1404510094/article/details/80379375 1. .ignore 生成各种ignore文件,一键创建git igno ...