Javascript Promise.resolve()和just resolve()之间的区别?
我写了下面的代码:Javascript Promise.resolve()和just resolve()之间的区别?,javascript,node.js,promise,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 fou
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);
})
发生了什么:如果文件存在,控制台输出就是实际找到的
文件
如果文件不存在,则显示:data.json文件不存在
以及错误堆栈
我想要什么:当文件确实存在时,我希望除了实际找到的文件之外,还显示找到的文件代码>。我发现当我替换
return Promise.resolve(“找到的文件”)时会发生这种情况代码>只需解析(“找到文件”)
甚至返回解析(“找到文件”)代码>
问题:
resolve()
和Promise.resolve()
之间到底有什么区别?为什么返回和不返回没有区别(我想这是因为它是函数中的最后一条语句)
注意:我使用existsSync()
是因为我希望进程在文件实际读取之前一直处于阻塞状态,因为如果文件未读取,则无需执行任何操作!我知道这里可能不需要承诺,但我仍然使用它,因为这是我正在努力学习的东西
谢谢
编辑:还有一个问题-应该拒绝和解决什么问题?我的意思是,在上面的代码中,我将新错误(…)
传递给拒绝()
,并将字符串传递给解析()
-可以吗?承诺。解析将表达式包装在承诺中。所以Promise.resolve(“找到文件”)
是“找到的文件”
包装在一个立即解决的承诺中
看看包装好的承诺在代码中的位置-您将它返回给新承诺
构造函数的调用者。但是Promise构造函数完全忽略返回值(如果有的话)。这有点像在forEach
中迭代时返回的东西-它只是被忽略了
为了解析通过承诺构造函数构造的承诺,必须调用提供给回调的第一个参数(通常称为resolve
,但可以任意命名)
还请注意,根本不需要在新错误
中包装拒绝-如果您只需要向消费者发送一条字符串消息,只需一个字符串就可以拒绝
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
。Promise.resolve返回解析为给定值的承诺。解决解决你要求它的承诺。。。你永远不需要像现在这样使用Promise.resolve,因为它不会解决你所说的承诺-注意:Promise.resolve是一种承诺的方法,而resolve只是一种约定。。。你可以做新的Promise((好,坏)=>good(1))代码>。。。这个承诺是@AnkurR的可能副本-不是真的,至少在这个问题上,没有永远悬而未决的承诺:p@AnkurR,这根本不是一个承诺构造函数。你们在寻找它们之间的区别,这个问题的答案也澄清了这一点。您的用法完全不同。请您详细说明一下-但是Promise构造函数完全忽略了返回值(如果有的话)?构造函数的全部目的不就是构造一些东西并将其返回给调用方吗?换句话说,如果不忽略返回值,承诺构造函数应该做什么?是的,承诺构造函数忽略其返回值。与Promise的使用者通信的唯一方法是调用resolve
和reject
函数(构造函数回调的两个参数)。这是您在承诺构造函数中应该做的事情-始终最终调用resolve
或reject
,以便使用承诺的任何人都可以看到承诺何时解析或拒绝。感谢您的帮助。所以,我想澄清一下,当我调用Promise.resolve()
时,我是否在做一些不同于resolve()
的事情?我的意思是,是的,我用Promise.resolve()
,将一个表达式包装在一个Promise中,但是后来为什么没有打印这个表达式(在then()
的回调中)?当你调用Promise.resolve
时,你将一个表达式包装在一个Promise中,然后包装的Promise就不用了,因为,就像我说的,承诺构造函数忽略其返回值。将Promise构造函数内部的内容与外部的内容链接起来的方法是调用提供给回调的一个参数——默认情况下,其他任何内容都不会与回调外部连接<代码>解析()
解析构造的承诺Promise.resolve('foo')
创建了另一个未使用的承诺,所以它什么都不做。啊,现在我明白了。完美的谢谢你的帮助!
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");
}
})
}