我有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()
这就是我想要的。
我怎样才能解决这个问题?
这不起作用:
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)
}
})()
你的问题是Promise.all不保证处理的顺序,只是处理列表中的所有promise。
你能说:
await create();
await read();
await waitt();