创建Promise, 应该怎么写
发布于 7 年前 作者 immatt2015 5822 次浏览 来自 问答

在看同事代码时候发现一处写法:

new Promise((resolve, reject) => {
    fs.unlink('***.json', err => {
        if (err) reject(err)
        resolve()
    })
})

这种写法与下面的写法 那种会好一些?

new Promise((resolve, reject) => {
    fs.unlink('****.json', err => {
        if (err) return reject(err)
        return resolve()
    })
})
10 回复

看你要如何用,不管是reject还是resolve返回的都是一个promise,因此可以链式调用 你在fs.unlink的回调函数里返回有意义么?没意义。 注意任何一个函数如果你不显式返回,默认都是返回undefined。 回调里resolve, reject函数调用返回的都是undefined,所以 return resolve()等价于resolve(); return undefined;等价于resolve(),对于reject同样。 哪个好一点相信楼主心中已经很清楚了

两种写法效果也是一样的,都没什么问题

new Promise((resolve, reject) => {
    fs.unlink('****.json', err => {
        if (err) return reject(err)
		// 假如这里还有一些逻辑,如果err了,但是不return reject(err) 的话,那么这里的代码还会继续执行
		// 但实际你是不想要它继续执行的
        return resolve()
    })
})

这是问箭头函数用法,你应该看看这篇文章 https://cnodejs.org/topic/584a207a3ebad99b336b1ede

其实我想问的是 Promise 构造函数中的resolve 和 reject 调用 时, 该不该 return 掉, 停止执行后面的逻辑。

应该 return 并且应该规范编写:

new Promise((resolve, reject) => {
    fs.unlink('****.json', (err) => {
        if (err) { return reject(err) }
        return resolve()
    })
})

@immatt2015 觉得需要看代码的上下文才能定这个~

主要看场景,如果err只是为了提示错误,而不中断的话,无所谓

請寫好if-else就不存在上面提到的問題了。

你们平时写的时候真的是 (resolve, reject) 全写嘛… 我都是写 (yes,no) 的…

const fs = require('fs');
function create_promise() {
    return new Promise((resolve,reject) => {
        fs.readFile('./abc.txt',function (err,body) {
            if(err){
                reject(err);//1
            }
            console.log(`if not error,do something`);//2
            resolve(body);//3
        })
    })
}
create_promise().then(res => {
    console.log(`res = ${res}`);//4
},err => {
    console.log(`err = ${err}`);//5
});

0.前提,abc.txt不存在. 1.则会打印 [2] 和 [5] 2.如果在[1]加了return,则只会打印[5] 3.如果采用if(err){}else{}这样的写法,只会打印[5] 个人建议使用return写法,在不写完整if-else的情况下,[2]也会被执行.

回到顶部