Nodejs 的 Promise 实现是不是有问题?

2015-07-25 12:00:55 +08:00
 haozhang

我看zakas的understandinges6上面的例子实际运行出来的结果跟zakas讲的结果不一样,比如下面这个例子:

"use strict";

var p1 = new Promise((resolve, reject) => {
    resolve("this is p1");
});

var p2 = Promise.reject(2);

var p3 = new Promise((resolve, reject) => {
    resolve("this is p3");
});


var p4 = Promise.race([p1, p2, p3]);

p4
    .then(
        (value) => {
            console.log(value);
        },
        (error) => {
            console.log(error);
        }
    );

结果是:

this is p1

也就是说p4的fulfillment handler被调用了。

按照zakas讲的(我觉得zakas讲的没错啊),应该是p2初始就是rejected状态的,所以导致p4立即变成rejected,然后调用p4的rejection handler.

但现在却是p1抢先一步变成了fulfilled,然后导致p4变成fulfilled了。

4401 次点击
所在节点    程序员
29 条回复
haozhang
2015-07-26 23:43:15 +08:00
@otakustay 我的理解是:Promise.race()和Promise.all()方法看的是,谁先调用race或者all添加的回调函数,也就是race/all产生的promise对象的状态是根据谁先调用回调函数来判断的(这个回调函数指的是race/all添加的回调函数),根据这个理解,我仿写了一个race函数,你看看我的理解对不对:

var race = (array) => {
return new Promise((resolve, reject) => {
array.map((cur) => {
cur
.then(
(value) => {
resolve(value);
},
(error) => {
reject(error);
}
);
});
});
};
haozhang
2015-07-26 23:45:03 +08:00
haozhang
2015-07-26 23:45:55 +08:00
我受不了了....你看下面的代码吧,上面贴的代码格式太差了。
haozhang
2015-07-26 23:54:42 +08:00
otakustay
2015-07-27 11:52:27 +08:00
没错,race就是这么搞的,.map可以改成.each,更简单的写法:

Promise.race = (array) => new Promise((resolve, reject) => array.forEach((promise) => promise.then(resolve, reject)));

all要更麻烦些,有参数收集等
haozhang
2015-07-27 14:19:31 +08:00
ysmood
2015-07-31 06:21:23 +08:00
@otakustay race 和 all 的实现都不完全正确,或者不符合 ES6 的规范。数组的每个 item 可以不是 promise 的,应该用 resolve wrap 起来,比如 race 的例子:

Promise.race = (arr) => new Promise((resolve, reject) => arr.forEach((v) => Promise.resolve(v).then(resolve, reject)));

另外不要忘记判断 arr 是否是 iterable 类型。虽然有点吹毛求疵了 XD
haozhang
2015-07-31 07:24:48 +08:00
@ysmood →_→ 我只是大致实现了一下
otakustay
2015-07-31 11:22:05 +08:00
@ysmood 我懂,但是我懒得在v2上敲这么多代码啊- -

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

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

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

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

© 2021 V2EX