Node Async / Await / Promise.All不等待其他人完成

问题描述 投票:0回答:2

我有3个函数需要按顺序运行,一个需要在另一个运行之前完成所以我已经完成了这个:

var fs = require('fs');

async function create() {

    fs.writeFile('newfile.txt', 'some text here', (err) => {
        if (err) throw err;
        console.log('File is created successfully.');
        return ('File is created successfully.');
    }); 

}

async function waitt() {
    setTimeout(() => { return 'waited!' }, 10000);
}

async function read() {

    fs.readFile('newfile.txt', {encoding: 'utf-8'}, (err,data) => {
        if (!err) {
            console.log('received data: ' + data);
            return ('received data: ' + data);
        } else {
            console.log(err);
        }
    });

}

async function process() {

    let [r1, r2, r3] = await Promise.all([create(), waitt(), read()]);

    console.log(r1 + ' ' + r2 + ' ' + r3);

}


process();

因此,process()运行create()创建一个文件,然后运行waitt(),它只是暂停,最后read()显示文件的内容。

我遇到的问题是它按此顺序运行:

create()
read()
and then waitt()

代替

create()
waitt()
read()

这就是我想要的。

我怎样才能解决这个问题?

javascript node.js promise async-await
2个回答
2
投票

这不起作用:

async function waitt() {
  setTimeout(() => { return 'waited!' }, 10000);
}

因为,你是从return回调中的setTimeout-ing,而不是async标记的wait函数。

要混合回调式代码和async / await,您必须首先将回调样式代码转换为使用Promises,或者使用已经提供fs-extra函数返回promises的fs

像这样的东西:

function waitt() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('waited...')
    }, 10000)
  })
}

这同样适用于您的其他功能。

另请注意,如果函数显式返回Promise,则不需要将其标记为等待async,因为await基本上与Promises一起使用。

现在订购:

Promise.all不保证订单,因为您可以通过简单的for..of逃脱,或者只是自己调用这些功能。

function wait() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('waited...')
      resolve('foo')
    }, 500)
  })
}

// Assume this is your promisified read function.
function read() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('read...')
      resolve('bar')
    }, 500)
  })
}

// Assume this is your promisified create function.
function create() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('created...')
      resolve('baz')
    }, 500)
  })
}

;(async () => {
  try {
    await create()
    await wait()
    await read()
  } catch (err) {
    console.error(err)
  }
})()

-1
投票

你的问题是Promise.all不保证处理的顺序,只是处理列表中的所有promise。

你能说:

await create();
await read();
await waitt();
© www.soinside.com 2019 - 2024. All rights reserved.