异步等待与回报承诺的好处

时间:2019-02-26 21:28:36

标签: javascript ecmascript-6 promise async-await es6-promise

我只是想了解它的好处:

const populateUsers = done => {
  User.remove({}).then(async () => {
    const userOne = new User(users[0]).save();
    const userTwo = new User(users[1]).save();
    const usersProm = await Promise.all([userOne, userTwo]).then(() => done());
    return usersProm;
  });
};

对此:

const populateUsers = done => {
  User.remove({})
    .then(() => {
      const userOne = new User(users[0]).save();
      const userTwo = new User(users[1]).save();

      return Promise.all([userOne, userTwo]);
    })
    .then(() => done());
};

我之所以遇到这个问题,是因为eslint建议我在此函数中使用async,并且我还记得这个概念,使其在我的应用程序中可以正常工作,但是我不确定为什么我应该使用它而不是原来的方式

2 个答案:

答案 0 :(得分:0)

您的第一个版本并非一路走来。这样做:

const populateUsers = done => {
  User.remove({}).then(async () => {
    const userOne = new User(users[0]).save();
    const userTwo = new User(users[1]).save();
    await Promise.all([userOne, userTwo]);
    const usersProm = await done();
    return usersProm;
  });
};

没什么区别,只是没有这些then回调的代码更容易阅读。

您甚至可以将其应用于外部函数:

const populateUsers = async () => {
  await User.remove({});
  const userOne = new User(users[0]).save();
  const userTwo = new User(users[1]).save();
  await Promise.all([userOne, userTwo]);
  const usersProm = await done();
  return usersProm;
};

现在populateUsers返回了诺言,而不是undefined

评论中的结论:您会因为populateUsers返回了一个承诺并接受一个done回调参数而收到错误,而其中的一个是预期的,不是两者都是。

答案 1 :(得分:0)

您的原始代码完全没问题。

否,使用第一个代码段中的代码没有任何好处。您应该avoid mixing await and .then(…) syntax!要使用class:<class 'numpy.ndarray'> / async,您需要使用整个函数await,而不是async回调:

then

(可能您还会删除该async function populateUsers(done) { await User.remove({}) const userOne = new User(users[0]).save(); const userTwo = new User(users[1]).save(); await Promise.all([userOne, userTwo]); return done(); } 回调-该函数已经返回了Promise)