javascript - 顺序 promise 的问题

标签 javascript es6-promise

我正在尝试正确理解 Promise。

我有一个 sleep 函数,如果我传递一个时间,它就会延迟执行它。我想按顺序执行所有内容。

问题:

1: 然而,有时我的“完成”甚至在 promise 完全兑现之前就被告知了。有人可以解释一下我的代码中的错误在哪里吗?

2:我可以在这里使用 async wait 而不是 Promise 吗?如果是的话怎么办?

我的尝试:

/* Do the following: 
2- creating sequential promise, by wait for 1s, 2s and 3s sequentially. And showing result for each promise is done.
3- creating parallel promise, by wait for 1s, 2s and 3s parallelly. And showing result when all promise is done.
4- creating mixed promise, by wait 1s, 2s squentially, after then wait for 3s, 4s, 5s parallelly.
5- createing sequential promise, by wait for 1s, undefined and 3s sequentially. catch the error.
6- createing sequential promise, by wait for 5 different numbers, with random number as input.
*/

// Sleep takes time and returns time+1 
const sleep = (time) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`Resolving: ${time}+1`);
            resolve(time+1);
        }, time*1000);
    });
}


// Generate Random number within a range.
const randomNumber = (min=1, max=8) => { 
    return Math.floor(Math.random() * (max-min+1) + min);
 } // -5~5
 

console.log(
sleep(randomNumber())
    .then(sleep(randomNumber()))
    .then(sleep(randomNumber()))
    .then(sleep(randomNumber()))
    .then(sleep(randomNumber()))
    .then((e)=> {
        console.log("Done", e); // Done called when all promises are done.
    })
)

最佳答案

.then 接受一个函数参数,而不是Promise。改变你的

.then(sleep(randomNumber()))

发送至

.then(() => sleep(randomNumber)

以便将函数放入Promise链中,当前面的.then解析时将调用该函数。否则,一旦 Promise 链创建,每个 sleep(randomNumber()) 都会立即被调用。

/* Do the following: 
2- creating sequential promise, by wait for 1s, 2s and 3s sequentially. And showing result for each promise is done.
3- creating parallel promise, by wait for 1s, 2s and 3s parallelly. And showing result when all promise is done.
4- creating mixed promise, by wait 1s, 2s squentially, after then wait for 3s, 4s, 5s parallelly.
5- createing sequential promise, by wait for 1s, undefined and 3s sequentially. catch the error.
6- createing sequential promise, by wait for 5 different numbers, with random number as input.
*/

// Sleep takes time and returns time+1 
const sleep = (time) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`Resolving: ${time}+1`);
            resolve(time+1);
        }, time*1000);
    });
}


// Generate Random number within a range.
const randomeNumber = (min=1, max=8) => { 
    return Math.floor(Math.random() * (max-min+1) + min);
 } // -5~5
 

console.log(
sleep(randomeNumber())
    .then(() => sleep(randomeNumber()))
    .then(() => sleep(randomeNumber()))
    .then(() => sleep(randomeNumber()))
    .then(() => sleep(randomeNumber()))
    .then((e)=> {
        console.log("Done", e); // Done called when all promises are done.
    })
)

要并行运行它们并在全部解决后运行某些内容,请使用 Promise.all:

Promise.all([
  sleep(randomeNumber()),
  sleep(randomeNumber()),
  sleep(randomeNumber()),
  sleep(randomeNumber()),
  sleep(randomeNumber())
])
  .then(() => console.log('all done'));

关于javascript - 顺序 promise 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52640581/

相关文章:

javascript - 更改为默认样式

javascript - JQuery 可排序序列化

javascript - 将选取器行标题从黑色更改为白色

javascript - 将循环回调连接到 promise 链

javascript - 处理未处理的 promise 拒绝: Difference between onunhandledrejection and unhandledrejection

Javascript:Promise.all 似乎没有解决

javascript - 如何检查屏幕阅读器是否在 html5 应用程序中运行

javascript - 在 div 内移动光标图像

javascript - JavaScript 永远悬而未决的 promise 不好吗?

javascript - promise 解决得太快