Heim > Fragen und Antworten > Hauptteil
请教正确的promise用法!!!
下面是错误的写法 最后没有return的结果就是 调用这个API函数拿不到promise
const apiFunction = () => {
return Promise.resolve()
.then(() => (demoResolve()))
.then(() => (demoReject()))
.then((data) => {
// bug
Promise.resolve(data);
})
.catch((err) => {
// bug
Promise.reject(err);
});
};
改进后下面这个promise方法能够如预期的拿到promise的值
const apiFunction = () => {
return Promise.resolve()
.then(() => (doResolve()))
.then(() => (doReject()))
// okay √
.then((data) => Promise.resolve(data))
// okay √
.catch((err) => Promise.reject(err));
};
之后又尝试了一种写法,感觉这种写法和第一种写法没有什么区别,但是这样也写也是可以得到正确结果的。
请问这是什么情况呢?
这样写有错误吗?
const apiFunction = () => {
return Promise.resolve()
.then(() => (doResolve()))
.then(() => (doReject()))
.then(Promise.resolve)
.catch(Promise.reject);
};
是不是等价于这种写法
const apiFunction = () => {
return Promise.resolve()
.then(() => (doResolve()))
.then(() => (doReject()))
.then(result)
.catch(err);
};
迷茫2017-04-17 15:27:08
1.对比一下ES6 =》 ES5后,第一种很第二种写法的区别,主要是promise是否return
//----------------case 1-------------------------------
var apiFunction = function apiFunction() {
return Promise.resolve().then(function () {
return demoResolve();
}).then(function () {
return demoReject();
}).then(function (data) {
// bug
AL.Promise.resolve(data);
}).catch(function (err) {
// bug
AL.Promise.reject(err);
});
};
//---------------------------case2--------------------------------
var apiFunction2 = function apiFunction2() {
return Promise.resolve().then(function () {
return doResolve();
}).then(function () {
return doReject();
})
// okay √
.then(function (data) {
return Promise.resolve(data);
})
// okay √
.catch(function (err) {
return Promise.reject(err);
});
};
第三种和第一种的区别也是是否return
天蓬老师2017-04-17 15:27:08
AL.
哪儿来的更新一下。
卧槽,当时看到这个提问,题主确实写错了,我就问了一下。后来再次进来看到其他答案都说了正确答案了,就没管,今天还被人踩了一下。真心觉得委屈啊。
好吧,再跟一遍答案。
promise的then中是要return的,用于生成一个新的promise给后面使用。
匿名的箭头函数一个表达式的时候,默认就是return 它的。
直接.then(Promise.resolve)
写的时候是相当于给then传进去了Promise.resolve
这个方法作为回调,当然也是正确的。
.then(result)
这种写法,我不知道result这个是啥,题里面没说!
总之,then最后要return,用于生成新的promise给后面的链式调用。