hjm*_*hjm 4 javascript promise ecmascript-6
我想知道在另一个承诺解决之后调用承诺的正确方法是什么.我知道我们可以使用async await来创建解析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();
Run Code Online (Sandbox Code Playgroud)
要么
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();
Run Code Online (Sandbox Code Playgroud)
任何一个都没问题.你的选择.
在第一个你是嵌套.then()处理程序.在第二个中,您使用较新await的序列来对它们进行排序.越来越多的人开始使用await它,因为它似乎是更简单的排序操作代码(假设你做了正确的错误处理),虽然在这种情况下,它们的复杂性非常相似,特别是下面建议的简化,所以这取决于你自己的个人编码风格.
两者中缺少的是get()只返回一个promise,所以你需要使用它.then()并.catch()使用它来获取值并捕获任何错误.
另外,第一个缺少的是你没有返回第二个promise,这意味着调用者不知道第二个操作何时完成.
你的第一个可以简化和修复如下:
const get = () => {
return fetchSomething().then(fetchSomethingElse);
}
get().then(val => {
// done here
}).catch(err => {
// error here
});
Run Code Online (Sandbox Code Playgroud)
正如Pointy所说,你不是"做出承诺".你"调用一个返回一个承诺的函数".承诺是对象.他们不可赎回.
你的标题可能被重写的可能是:"正确的方法来排序每个返回一个承诺的两个异步操作".
为了完整起见,如果您的两个异步操作不相互依赖,则您不必手动对它们进行排序.您可以启动它们,然后监视何时完成.这有时会得到更快的端到端响应.
你可以这样做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;
});
}
Run Code Online (Sandbox Code Playgroud)