JavaScript 中的 Promise 跟异步有关系吗?还是我的理解有问题?谁能把 Promise 解释清楚? Promise 的正确用法应该是什么样的?

2 天前
 burnbrid

感觉 Promise 跟异步没有关系啊!我理解的异步是 ajax 这样的,ajax 将请求发出去之后,代码就继续往下执行了,等到 ajax 收到响应结果了,再回头执行 ajax 的回调函数,这才是异步。不是说你指定了回调函数就是异步。Promise 构造函数里面的代码是同步执行的,假如在 Promise 构造函数里面执行一个 10 万次的循环,主线程会等这 10 万次执行结束之后,才会继续执行下一行代码,这叫异步吗?异步跟回调函数没有一点关系。 异步就是不在主线程里面执行。

const ps = new Promise(function name(resolve, reject) { let i = 0; while(i<1000000){ i = i+1; console.log('i=',i); } }); console.log('promise 是异步吗?');

等上面这 100 万次循(最耗时的操作)环执行完,我还有必要通过 then 去指定回调函数吗?我直接执行回调函数就可以了,根本不需要通过 then 去执行回调函数。

3024 次点击
所在节点    JavaScript
49 条回复
yunyuyuan
1 天前
@ilylx2008 rxjs 和 promise 没有关系,可以把它理解为语法糖


@xbigfat 你这个需求可以使用 rxjs 的 switchMap 实现
IvanLi127
1 天前
@ilylx2008 为了实现 stream 模式呗,await 只能收一次值,then 也是,但是 rxjs 能收多次。
yagamil
1 天前
我觉得这样才是异步吧

```const ps = new Promise(function name(resolve, reject) {
setTimeout(() => {
let i = 0;
while (i < 100) {
i = i + 1;
console.log("i=", i);
}
resolve();
}, 1000);
}).then(() => {
console.log("promise is done");
});

console.log("promise 是异步吗?");
```
xavierchow
1 天前
https://www.promisejs.org/implementing/
虽然是 7 、8 年前的文章了,可以尝试跟着它自己实现一遍 promise ,会比较清楚它的本质。
关于题主的问题,promise 和回调有关系,和异步不一定有关系,回调本质上是 A 告诉 B 让 B 在一定的条件下来调用 A ,至于 B 处理本身是不是同步的(比如题主的循环 10 万次),这个和回调(或者 promise )没有必然关系。
总而言之,JS 的 event loop 机制是非阻塞的(异步),它依赖于回调函数,而 promise 主要是针对处理回调地狱问题的一个解决方案。
jiangzm
1 天前
Promise 当然是异步,promise 初始化函数是同步执行,这个并不矛盾
jiangzm
1 天前
@xbigfat #39 你第一步没给返回值,第二步当然拿不到
正确写法 let a = await fetch().then(res=>{return res.json()});
或者 let a = await fetch().then(res=> res.json());
wangtian2020
12 小时 27 分钟前
回调是异步,promise 也是异步。区别是 promise 能竖着往下写,能前面加上 await 就拿到 then 的结果。
而回调用一次就会让你的代码缩进一次,你把所有的代码全写在登录请求的回调里面,你的代码就会进入“回调地狱”你的代码永远出不去回调方法,写在三角形的顶部区域,可读性极差
kkhaike
11 小时 56 分钟前
是不是该这样解释?
Promise 是解决回调地狱问题的回调方法封装对象
async/await 是让使用 Promise 对象更简单的一个语法糖
xbigfat
4 小时 20 分钟前
@jiangzm 我回头试一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1118623

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX