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

176 天前
 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 去执行回调函数。

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


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

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

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

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

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

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

© 2021 V2EX