首页 > 解决方案 > 为什么我们没有在彼此内部链接承诺?

问题描述

在有关承诺的 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像上面的代码那样键入声明每个承诺吗?如果是,我为什么需要这样做?

标签: javascript

解决方案


您最初的问题可以通过将事物重写为变量赋值来回答。

我在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');
}

推荐阅读