更改我的回调,承诺异步等待

时间:2018-12-04 07:02:02

标签: javascript callback promise async-await

我的代码:

回调:

const first = () => {
  console.log('first');
};
const second = (callback) => {
   setTimeout(() => {
    console.log('second');
    callback();
  }, 2000);
};
const third = () => {
   console.log('third');
};

first();
second(third);   OUTPUT: 'first', 'second', 'third'

承诺:

const first = () => new Promise((resolve, reject) => {
  resolve('first');
});
const second = () => new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('second');
  }, 2000);
});
const third = () => {
  console.log('third');
};

first()
 .then((firstPromiseValue) => {
   console.log(firstPromiseValue);
   second()
    .then((secondPromiseValue) => {
      console.log(secondPromiseValue);
      third();
    })
 });   OUTPUT: 'first', 'second', 'third'

全部兑现:

const first = new Promise((resolve, reject) => {
  resolve('first');
});
const second = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('second');
  }, 2000);
});
const third = new Promise(function(resolve, reject) {
  resolve('third');
});
Promise.all([first, second, third]).then((values) => {
  console.log(values);
}); OUTPUT: ['first', 'second', 'third']

异步等待:

如何使用异步等待转换上述代码?

哪个是针对javascript应用程序的良好流程控制?

一些使用async.waterfall等方法的异步库呢?

顺便问一下,我上面的代码可以吗?

2 个答案:

答案 0 :(得分:2)

  

如何使用异步等待转换上述代码?

async/await不能替代诺言,它可以替代then()catch()。您仍然会使用诺言。因此,您将从“承诺”部分中选取firstsecondthird定义,然后:

async function firstSecondThird() {
  let firstPromiseValue = await first();
  console.log(firstPromiseValue);
  let secondPromiseValue = await second();
  console.log(secondPromiseValue);
  third(); // not a promise, no need to await
}
firstSecondThird();
  

哪个是针对javascript应用程序的良好流程控制?

客观地讲,没有一个是更好的。但是async/await是最易读的,回调是最明确的(then代码位于中间)。

  

一些使用async.waterfall等方法的异步库呢?

Promise通常会执行这些库所做的所有事情,并且也会被选择进行标准化。除非您维护需要它们的旧代码,否则您可能会忘记这些库。

  

顺便问一下,我上面的代码可以吗?

它似乎或多或少地完成了您想要的操作,而效率或易读性方面没有明显的问题。我会没事的。

答案 1 :(得分:-1)

  

如何使用异步等待转换上述代码?

使用async/await是使用Promises的另一种方法。这是最好的视觉效果,因为您不会迷失then/catch,但可以使用它。这里有两个例子。第一个有然后,第二个没有。

const first = async (value) => {
  return new Promise((resolve, reject) => {
    resolve('first ');
  });
};
const second = async (value) => {
  return new Promise((resolve, reject) => {
    resolve(value + 'second ');
  });
};
const third = async (value) => {
  return new Promise((resolve, reject) => {
    resolve(value + 'third');
  });
};


first('').then(second).then(third).then( value => console.log(value) );


const first = async () => {
  return new Promise((resolve, reject) => {
    resolve('first ');
  });
};
const second = async () => {
  return new Promise((resolve, reject) => {
    resolve('second ');
  });
};
const third = () => {
  return 'third';

};

async function main() {
  
  let firstValue = await first();
  
  let secondValue = await second();
  
  let thirdValue = third();
  
  return  firstValue + ' ' + secondValue + ' ' + thirdValue;
}

main()
  .then(console.log)
  .catch(err => { console.log('Error:', err) });

  

哪个是针对javascript应用程序的良好流程控制?

通常,当您需要在函数中间使用Promise或对函数进行多个异步调用时。

  

一些使用async.waterfall等方法的异步库呢?

我不知道要使用异步/等待的任何库。抱歉!