4

一个 async function 数组, 怎样一个一个顺序执行?

 2 years ago
source link: https://www.v2ex.com/t/810025
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  JavaScript

一个 async function 数组, 怎样一个一个顺序执行?

  selfcreditgiving · 13 小时 21 分钟前 · 666 次点击

想做到的是,每过一秒,分别打印:
this is 0
this is 1
this is 2
~
this is 8

下面的代码结果是过一秒后全部执行。

是不是哪里写的不对呢,多谢指教

var jobs = [];

for(let i = 0; i < 8; i++) {
    jobs.push(async function(){
        setTimeout(function(){
            console.log("this is " + i)
        },1000)
    });
}

(async function () {
    for (const job of jobs) {
        await job()
    }
        
})();
12 条回复    2021-10-24 00:33:09 +08:00

ruxuan1306

ruxuan1306   13 小时 18 分钟前

```
const job = new Promise((resolve, reject) => {
setTimeout(() => resolve, 3000)
})

console.log('start')
await job()
console.log('done')
```

ruxuan1306

ruxuan1306   13 小时 16 分钟前

async 只是 promise 的语法糖,await 本质上必须等待一个 promise ,如果 await 一个立即数,则会立即 resolve 。
setTimeout 返回的是 timer 的 id ,是一个立即数,所以会立即 resolve ,你必须返回一个 promise 。

codehz

codehz   13 小时 15 分钟前

var jobs = [];

for(let i = 0; i < 8; i++) {
jobs.push(() => new Promise(resolve => setTimeout(() => {
console.log("this is " + i);
resolve();
},1000)));
}

(async function () {
for (const job of jobs) {
await job()
}
})();

MonkeyD1

MonkeyD1   13 小时 15 分钟前

var jobs = [];

for (let i = 0; i < 8; i++) {
jobs.push(async function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(console.log("this is " + i));
}, 1000);
});
});
}

(async function () {
for (const job of jobs) {
await job();
}
})();

MonkeyD1

MonkeyD1   13 小时 14 分钟前

return promise

Curtion

Curtion   13 小时 13 分钟前

你得这样
```javascript
var jobs = [];

for(let i = 0; i < 8; i++) {
jobs.push(async function(){
return new Promise(resolve => {
setTimeout(function(){
console.log("this is " + i)
resolve()
},1000)
})
});
}

(async function () {
for (const job of jobs) {
await job()
}

})();
```

ruxuan1306

ruxuan1306   13 小时 12 分钟前

发现我代码里 resolve 漏了对括号,会导致无人调用 resolve 无限等待,我猜你应该明白该怎么改正。

0Vincent0Zhang0

0Vincent0Zhang0   12 小时 59 分钟前 via Android

把 1000 改为 (i+1)*1000 [doge]

kaixuan1901

kaixuan1901   12 小时 24 分钟前

```javascript
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

(async function() {
for (let i = 0; i < 8; i++) {
await sleep(1000);
console.log("This is " + i);
}
})();
```

wakaka

wakaka   6 小时 49 分钟前

好好理解一下 promise

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK