我想知道在另一个 promise 解决后调用 promise 的正确方法是什么。我知道我们可以使用 async await 来创建解决 promise 的函数。我想知道哪种形式的处理 promise 被认为是正确的做法,或者创建生成器是一种好的做法吗?考虑以下代码:
const fetchSomething = () => new Promise((resolve) => {
setTimeout(() => resolve(console.log('future value')), 500);
});
const fetchSomethingElse = () => new Promise((resolve) => {
setTimeout(() => resolve(console.log('future value dueeee')), 3000);
});
const get = () => {
return fetchSomething().then(function(){
fetchSomethingElse()
});
}
get();
或
const fetchSomething = () => new Promise((resolve) => {
setTimeout(() => resolve({resolve: true}), 500);
});
const fetchSomethingElse = () => new Promise((resolve) => {
setTimeout(() => resolve({resolve: true}), 3000);
});
const get = async function() {
const fet = await fetchSomething();
const fet2 = await fetchSomethingElse();
};
get();
最佳答案
两者都可以。你的选择。
首先,您要嵌套 .then()
处理程序。在第二个中,您使用较新的 await
对它们进行排序。越来越多的人转向 await
,因为它似乎是用于排序操作的更简单的代码(假设您进行了适当的错误处理),尽管在这种情况下,它们的复杂性非常相似,尤其是下面建议的简化所以这完全取决于您自己的个人编码风格。
两者都缺少的是 get()
只是返回了一个 promise,因此您需要使用 .then()
和 .catch()
用它来获取值并捕获任何错误。
此外,第一个中缺少的东西是您没有返回第二个 promise ,这意味着调用者不知道第二个操作何时完成。
您的第一个可以像这样简化和修复:
const get = () => {
return fetchSomething().then(fetchSomethingElse);
}
get().then(val => {
// done here
}).catch(err => {
// error here
});
正如 Pointy 所提到的,您不会“调用 promise ”。您“调用一个返回 promise 的函数”。 promise 是对象。它们不可调用。
可能您的标题可以重写为:“对每个返回 promise 的两个异步操作进行排序的正确方法”。
为了完整起见,如果您的两个异步操作不相互依赖,那么您不必手动对它们进行排序。您可以同时启动它们,然后在两者完成时进行监控。这有时会得到更快的端到端响应。
你可以使用 Promise.all()
来做到这一点:
const get = function() {
return Promise.all([fetchSomething(), fetchSomethingElse()]).then(results => {
// process results array and then return final value
// results[0] is result from fetchSomething, results[1] is result from fetchSomethingElse
return finalVal;
});
}
关于javascript - 排序两个异步操作的正确方法,每个异步操作返回一个 promise javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51690711/