我写了下面的代码:
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()
-可以吗?
答案 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
加上一个字符串。