gpt4 book ai didi

node.js - 何时拒绝/解决 promise

转载 作者:IT老高 更新时间:2023-10-28 23:05:08 24 4
gpt4 key购买 nike

我正在考虑什么时候我需要拒绝一个 promise 。我发现了一些关于这个主题的问题,但找不到正确的答案。 When should I reject a promise?

这篇文章 http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises说:

  • Resolve:成功的 Promise 是“resolved”,它调用正在等待的成功监听器,并记住为将来附加的成功监听器解析的值。分辨率与返回值相关。
  • 拒绝:当遇到错误情况时,Promise 会被“拒绝”,它会调用正在等待的错误监听器并记住被拒绝的值以供将来附加的错误监听器使用。拒绝与引发的异常相关。

这是基本准则吗?只有在发生异常时才拒绝 promise ?

但如果是这样的功能

findUserByEmail()

我希望该函数返回一个用户,这样我就可以在不验证结果的情况下继续执行链

findUserByEmail()
.then(sendWelcomeBackEmail)
.then(doSomeNiceStuff)
.then(etc..)

什么是最好的/常见的做法?

最佳答案

一般而言,您可以认为拒绝类似于同步 throw,而履行类似于同步 return。每当功能以某种方式不成功时,您都应该拒绝。这可能是超时、网络错误、输入错误等。

拒绝 promise ,就像抛出异常一样,对控制流很有用。它不必代表真正的意外错误;它可以代表您完全预期和处理的问题:

function getProfile(email) {
return getProfileOverNetwork(email)
.then(null, function (err) {
//something went wrong getting the profile
if (err.code === 'NonExistantUser') {
return defaultUser;
} else if (profileCached(email)) {
return getProfileFromCache(email);//fall back to cached profile
} else {
throw err;//sometimes we don't have a nice way of handling it
}
})
}

拒绝让我们跳过正常的成功行为,直到我们找到一个知道如何处理它的方法。作为另一个例子,我们可能有一些深深嵌套在应用程序堆栈底部的函数,它会拒绝。这可能要到堆栈的最顶端才能处理,我们可以在其中记录它。关键是拒绝像同步代码中的异常一样在堆栈中向上传播。

一般来说,只要有可能,如果您正在努力编写一些异步代码,您应该考虑“如果这是同步的,我会写什么”。从它到 promise 的等价物通常是一个相当简单的转换。

exists 方法中可能使用被拒绝的 Promise 的一个很好的例子:

function exists(filePath) {
return stat(filePath) //where stat gets last updated time etc. of the file
.then(function () { return true; }, function () { return false; })
}

请注意,在这种情况下,拒绝完全是意料之中的,只是意味着文件不存在。还要注意它是如何与同步函数并行的:

function existsSync(filePath) {
try {
statSync(filePath);
return true;
} catch (ex) {
return false;
}
}

你的例子

回到你的例子:

如果没有找到用户,我通常会选择拒绝由 findUserByEmail 产生的 promise 。这是您完全期望有时会发生的事情,但它是规范的异常(exception),并且应该与所有其他错误非常相似地处理。同样,如果我正在编写一个同步函数,我会让它 throw 异常。

有时只返回 null 可能会有用,但这取决于您的应用程序逻辑,可能不是最好的方法。

关于node.js - 何时拒绝/解决 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17293546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com