【问题标题】:Difference between Promise.resolve() and just resolve()?Promise.resolve() 和 just resolve() 之间的区别?
【发布时间】:2019-12-16 19:09:41
【问题描述】:

我写了下面的代码:

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 is actually found! 之外,我还希望显示File found。我发现当我将return Promise.resolve("File found"); 替换为resolve("File found"); 甚至return resolve("File found"); 时会发生这种情况。

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

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

谢谢!

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

【问题讨论】:

  • Promise.resolve 返回一个解析为给定值的承诺。 resolve 解决了你调用它的承诺......你永远不需要像你一样使用 Promise.resolve,因为它不会解决你调用它的承诺 - 注意:Promise.resolve 是 Promise 的一种方法,resolve只是一个约定......你可以做新的Promise((good, bad) => good(1));......承诺得到解决
  • @AnkurR - 不是真的,至少在那个问题中没有永远悬而未决的承诺:p
  • @AnkurR,这根本与 promise 构造函数无关。
  • 您正在寻找它们之间的区别,并且该问题的答案也阐明了相同的问题。您的使用方式不同。

标签: javascript node.js promise


【解决方案1】:

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字符串。

【讨论】:

  • 能否详细说明 - 但 Promise 构造函数完全忽略返回值,如果有的话?构造函数的全部目的不就是构造 something 并将其返回给调用者吗?换句话说,如果不忽略返回值,Promise 构造函数应该做什么?
  • 是的,Promise 构造函数忽略了它的返回值。与 Promise 的使用者通信的唯一方法是调用 resolvereject 函数(构造函数回调的两个参数)。这就是您应该在 Promise 构造函数中执行的操作 - 最终始终调用 resolvereject,以便使用 Promise 的任何人都可以看到 Promise 何时解析或拒绝。
  • 感谢您的帮助。所以,澄清一下,当我打电话给Promise.resolve() 时,我做的事情与resolve() 不同吗?我的意思是,是的,我用Promise.resolve() 在Promise 中包装了一个表达式,但是为什么稍后没有打印该表达式(在then() 的回调中)?
  • 当你调用Promise.resolve 时,你将一个表达式包装在一个Promise 中,然后包装的Promise 就没有使用了,因为就像我说的那样,Promise 构造函数忽略了它的返回值。将 Promise 构造函数内部的内容与外部的内容链接的方法是调用提供给回调的参数之一 - 默认情况下,其他任何内容都不会与回调外部连接。 resolve() 解析构造的 Promise。 Promise.resolve('foo') 创建 another Promise 未使用,因此它什么也不做。
  • 啊,现在我明白了。完美的。感谢您的帮助!
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
相关资源
最近更新 更多