我写了下面的代码:
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");
用justresolve("File found");
或even替换时会发生这种情况return resolve("File found");
。
问题:和
之间的真正区别是什么?为什么返回或不返回没有区别(我想是因为它是函数中的最后一条语句)。resolve()
Promise.resolve()
注意:existsSync()
之所以使用,是因为我希望进程在实际读取文件之前一直处于阻塞状态,因为如果不读取文件,则无事可做!我知道这里可能不需要诺言,但我仍然使用诺言,因为这就是我要学习的内容。
谢谢!
编辑:另一个问题-什么实际上应该被拒绝和解决?我的意思是,在上面的代码中,我传递new Error(...)
了reject()
一个字符串并传递给了resolve()
-可以吗?
Promise.resolve
将表达式包装在Promise中。因此,Promise.resolve("File found");
被'File found'
包裹在一个承诺,立即解决。
查看包装好的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
一个字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句