Javascript 节点异步/wait/Promise.All不等待其他节点完成
我需要按顺序运行3个函数,其中一个函数需要在其他函数运行之前完成,因此我完成了以下操作:Javascript 节点异步/wait/Promise.All不等待其他节点完成,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,我需要按顺序运行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.');
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);
}
因为,您是从setTimeout
回调中返回的,而不是标记为wait
函数的async
要混合使用回调样式代码和async/await,必须首先将回调样式代码转换为use,或者使用已经提供了返回承诺的函数的函数
大概是这样的:
function waitt() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('waited...')
}, 10000)
})
}
这同样适用于其他函数
还请注意,如果函数显式返回承诺,则不需要将其标记为async
等待,因为等待基本上与承诺一起工作
现在开始下订单:
不能保证顺序,因为您可能只需要简单的调用,或者只需自己调用函数
函数等待(){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
console.log('waited…'))
解析('foo')
}, 500)
})
}
//假设这是您的预期读取函数。
函数read(){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
console.log('read…'))
解析('bar')
}, 500)
})
}
//假设这是您预期的create函数。
函数create(){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
console.log('created…'))
解析('baz')
}, 500)
})
}
;(异步()=>{
试一试{
等待创建()
等待等待
等待阅读
}捕捉(错误){
控制台错误(err)
}
})()
您的问题在于承诺。所有承诺都不能保证处理的顺序,只是列表中的所有承诺都已处理
你能不能说:
await create();
await read();
await waitt();
创建和阅读实际上并不是被要求的。从回调返回的结果实际上并不是从外部函数返回的。@jonrsharpe-wait
也很糟糕written@NikKyriakides已经提供了一个很好的答案,如果您使用的是fs
以及Promissions,我还建议您使用这个包,它增加了许多函数在不提供callbackFurthermore时自行返回承诺的功能,Promise.all()
表示函数并行运行,但您似乎希望它们按顺序运行我想做的是让它们一次运行一个这样您认为这三个函数编写正确吗,他们会返回一个承诺,一旦异步任务完成,这个承诺就会得到解决?