Promise.resolve()和resolve()之间的区别?

时间:2019-08-09 04:00:22

标签: javascript node.js promise

我写了下面的代码:

function readFile(path) {
    return new Promise(function(resolve, reject){
        if(!fs.existsSync(path))
            return reject(new Error("data.json file does not exist"));
        else {
            console.log("File is actually found!");
            return Promise.resolve("File found");
        }
    })
}

readFile(path)
    .then(value => {
        console.log(value);
    })
    .catch(err => {
        console.log(err);
    })

会发生什么:
如果该文件存在,则控制台输出仅为File is actually found!。如果该文件不存在,则显示:data.json file does not exist以及错误堆栈。

我想要的是
该文件确实存在时,除了File found外,我还希望显示File is actually found!。我发现当我只用return Promise.resolve("File found");甚至是resolve("File found");替换return resolve("File found");时就会发生这种情况。

问题:
resolve()Promise.resolve()之间的真正区别是什么?为什么返回或不返回 not 会有所不同(我想这是因为它是函数中的最后一条语句)。

注意:我使用existsSync()是因为我希望进程在实际读取文件之前一直处于阻塞状态,因为如果不读取文件,则无事可做!我知道这里可能不需要诺言,但是我仍然使用诺言,因为那是我要学习的东西。

谢谢!

编辑:还有一个问题-什么实际上应该被拒绝和解决?我的意思是,在上面的代码中,我将new Error(...)传递给reject(),并将字符串传递给resolve()-可以吗?

1 个答案:

答案 0 :(得分:4)

Promise.resolve将表达式包装在Promise中。因此Promise.resolve("File found");'File found'包裹在一个立即解决的Promise中。

看看这段代码中包装好的Promise的去向-您将其返回给new Promise构造函数的调用者。但是Promise构造函数完全忽略返回值(如果有)。就像在forEach中进行迭代时返回一些内容一样-只是被忽略了。

为了解析通过Promise构造函数构造的Promise,必须 调用提供给回调的第一个参数(通常命名为resolve,但可以命名为您想要的任何名称) )。

还请注意,根本不需要将拒绝包装在new Error中-如果您只需要向用户发送字符串消息,那么只用一个字符串拒绝就可以了。

function readFile(path) {
    return new Promise(function(resolve, reject){
        if(!fs.existsSync(path))
            reject("data.json file does not exist");
        else {
            console.log("File is actually found!");
            resolve("File found");
        }
    })
}

等同于:

function readFile(path) {
    return new Promise((fnToCallToResolveConstructedPromise, fnToCallToRejectConstructedPromise) => {
        if(!fs.existsSync(path))
            fnToCallToRejectConstructedPromise("data.json file does not exist");
        else {
            console.log("File is actually found!");
            fnToCallToResolveConstructedPromise("File found");
        }
    })
}

除了描述错误的字符串,可以将其包装在错误对象中(如果它为您提供了有用的信息),但是最好省略它,只需调用reject加上一个字符串。