javascript - 为什么我们没有在彼此内部链接承诺?
问题描述
在有关承诺的 youtube 教程视频之一中,我发现了以下代码:
let cleanRoom = function() {
return new Promise((resolve, reject) => {
resolve();
});
};
let removeGarbage = function() {
return new Promise((resolve, reject) => {
resolve();
});
};
let winIcecream = function() {
return new Promise((resolve, reject) => {
resolve();
});
};
cleanRoom().then(function(){
return removeGarbage();
}).then(function() {
return winIcecream();
}).then(function() {
console.log('finished');
})
为什么承诺没有像每个 .then 单词那样链接在前一个承诺之后?我的意思是,为什么例如.then
不是在之后removeGarbage()
而是在之后cleanRoom().then()
,winIcecream()
在解决removeGarbage
承诺之后将如何运行?我还需要return
像上面的代码那样键入声明每个承诺吗?如果是,我为什么需要这样做?
解决方案
您最初的问题可以通过将事物重写为变量赋值来回答。
我在return
这里使用箭头函数语法来隐式地使用新表达式;如果您使用的是常规函数,那么是的,如果您想按顺序运行它们,则必须返回新的链式 Promise。
const roomCleanedPromise = cleanRoom();
const roomCleanedAndGarbageTakenOutPromise = roomCleanedPromise.then(() => removeGarbage());
const roomCleanedAndGarbageTakenOutAndIcecreamWonPromise = roomCleanedAndGarbageTakenOutPromise.then(() => winIcecream());
const finishedPromise = roomCleanedAndGarbageTakenOutAndIcecreamWonPromise.then(() => console.log('finished'));
然而,使用更现代的async
/await
语法编写起来更容易——你提到的 YouTube 教程可能有点过时了。
async function cleanRoom() {
console.log('Cleaning room.');
// this could do other async things or just take a while
return {room: 'clean'}; // just to demonstrate a return value
}
async function removeGarbage() {
console.log('Removing garbage.');
// this could do other async things or just take a while
return {garbage: 'removed'};
}
// third function elided for brevity
async function doAllTheThings() {
const roomStatus = await cleanRoom();
const garbageStatus = await removeGarbage();
console.log('finished');
}
推荐阅读
- powershell - 在 Powershell 中拉取子字符串
- javascript - 未捕获的类型错误:无法读取未定义的属性“国家”
- php - 您好,我想使用 ajax 按日期进行过滤,使用复选框来检索我在 laravel 数据库中的报价
- django - 处理数百万条记录并保存回数据库的有效方法是什么?
- python - 使用 seaborn 的 kdeplots 绘制多个填充轮廓子图时的空白
- html - 在 child-div 中设置父母 div 填充的背景颜色
- json - 颤振循环通过由单节点和具有子节点的节点组成的firebase节点
- django - uwsgi 2.0.17 + django 2.0.3 worker 偶尔崩溃
- javascript - Firebase 使用 Ionic Infinite 滚动按日期排序
- html - 如何将 Angular Material 主题应用于非材质组件?