多个IF条件使用Async/await在nodejs中一一执行
multiple IF conditions execute one by one in nodejs using Async/await
我如何 运行 同步执行此 if 语句。我已经尝试了很多次,但无法解决这个问题。 (我是 nodejs 初学者)。
我想在这里使用 async/await 但它不起作用。
我如何首先检查条件是否完成,然后第二个 if 语句将 运行!
请帮忙。
这是我的虚拟代码:
record1='10';
record2='20';
function main(){
if(record1){
console.log('-------------------------');
console.log('I am record 1')
val='John',
firstJob(val)
}
if(record2){
console.log('I am record 2')
val='Rahul',
firstJob(val)
}
}
async function firstJob(val){
console.log('Hello, I am ' + val)
await secondJob(val);
}
async function secondJob(val){
console.log(val+ ' is a nodeJs beginner!')
await listFiles()
}
function thirdJob(arg){
if (arg='pass'){
console.log('This is end of the one if condition')
}
}
function listFiles (){
return new Promise((resolve, reject) => {
setTimeout(() => {
const path = require('path');
const fs = require('fs');
const { exit } = require('process');
const directoryPath = path.join(__dirname, '../');
console.log('List of Avaialble Files :');
fs.readdir(directoryPath, { withFileTypes: true },function (err, files) {
if (err) {
return console.log('Unable to scan directory: ' + err);
}
files.forEach(function (file) {
if (file.isFile()){
console.log(file);
}
});
});
arg='pass'
thirdJob();
}, 2000)
})
}
main();
简短的回答是你不能“同步运行”。
你必须耐心等待他们完成才能得到答案。
因此,如果不进行 main
async
,您必须以老式的方式使用承诺,并使用 then
.
对操作进行排序
record1='10';
record2='20';
function main(){
Promise.resolve()
.then(() => {
if(record1){
console.log('-------------------------');
console.log('I am record 1');
val='John';
return firstJob(val)
}
})
.then(() => {
if(record2){
console.log('I am record 2')
val='Rahul';
return firstJob(val)
}
});
}
async function firstJob(val){
console.log('Hello, I am ' + val)
await secondJob(val);
}
async function secondJob(val){
console.log(val+ ' is a nodeJs beginner!')
await listFiles()
}
main();
我刚刚包含了 if
和 promise 内容的片段。这里的要点是,您有条件地将对 firstJob
.
的调用链接在一起
每次调用 then
都允许您(可能不是必需的)将另一个承诺附加到刚刚完成的承诺的执行中。在上面的代码片段中,只有当条件为真时,我们才会这样做,方法是从对 firstJob 的调用中返回承诺。
顺便说一下,您对 listFiles
的实现永远不会完成,因为您永远不会调用 resolve
来实现您在函数内做出的承诺。这通过在循环完成后解决您的承诺来解决问题。
function listFiles (){
return new Promise((resolve, reject) => {
setTimeout(() => {
const path = require('path');
const fs = require('fs');
const { exit } = require('process');
const directoryPath = path.join(__dirname, '../');
console.log('List of Avaialble Files :');
fs.readdir(directoryPath, { withFileTypes: true },function (err, files) {
if (err) {
console.log('Unable to scan directory: ' + err);
reject(err);
}
files.forEach(function (file) {
if (file.isFile()){
console.log(file);
}
});
resolve();
});
arg='pass'
thirdJob();
}, 2000)
})
}
请注意在完成循环后添加的对 resolve
的调用。
在 readdir
返回错误的情况下,我还添加了对 reject
的调用,因为这是使用您的手动承诺传播它的正确方法。
还有一些提示,通常在文件顶部需要模块一次,而不是在函数内部动态调用。这样做的代价还不错,需要的模块有一个缓存。这只是不惯用语。
if (arg='pass'){
不做任何相等性检查,那是一个赋值,你需要 ==
,或者 ===
如果你想检查是否相等。
我如何 运行 同步执行此 if 语句。我已经尝试了很多次,但无法解决这个问题。 (我是 nodejs 初学者)。 我想在这里使用 async/await 但它不起作用。 我如何首先检查条件是否完成,然后第二个 if 语句将 运行! 请帮忙。 这是我的虚拟代码:
record1='10';
record2='20';
function main(){
if(record1){
console.log('-------------------------');
console.log('I am record 1')
val='John',
firstJob(val)
}
if(record2){
console.log('I am record 2')
val='Rahul',
firstJob(val)
}
}
async function firstJob(val){
console.log('Hello, I am ' + val)
await secondJob(val);
}
async function secondJob(val){
console.log(val+ ' is a nodeJs beginner!')
await listFiles()
}
function thirdJob(arg){
if (arg='pass'){
console.log('This is end of the one if condition')
}
}
function listFiles (){
return new Promise((resolve, reject) => {
setTimeout(() => {
const path = require('path');
const fs = require('fs');
const { exit } = require('process');
const directoryPath = path.join(__dirname, '../');
console.log('List of Avaialble Files :');
fs.readdir(directoryPath, { withFileTypes: true },function (err, files) {
if (err) {
return console.log('Unable to scan directory: ' + err);
}
files.forEach(function (file) {
if (file.isFile()){
console.log(file);
}
});
});
arg='pass'
thirdJob();
}, 2000)
})
}
main();
简短的回答是你不能“同步运行”。 你必须耐心等待他们完成才能得到答案。
因此,如果不进行 main
async
,您必须以老式的方式使用承诺,并使用 then
.
record1='10';
record2='20';
function main(){
Promise.resolve()
.then(() => {
if(record1){
console.log('-------------------------');
console.log('I am record 1');
val='John';
return firstJob(val)
}
})
.then(() => {
if(record2){
console.log('I am record 2')
val='Rahul';
return firstJob(val)
}
});
}
async function firstJob(val){
console.log('Hello, I am ' + val)
await secondJob(val);
}
async function secondJob(val){
console.log(val+ ' is a nodeJs beginner!')
await listFiles()
}
main();
我刚刚包含了 if
和 promise 内容的片段。这里的要点是,您有条件地将对 firstJob
.
每次调用 then
都允许您(可能不是必需的)将另一个承诺附加到刚刚完成的承诺的执行中。在上面的代码片段中,只有当条件为真时,我们才会这样做,方法是从对 firstJob 的调用中返回承诺。
顺便说一下,您对 listFiles
的实现永远不会完成,因为您永远不会调用 resolve
来实现您在函数内做出的承诺。这通过在循环完成后解决您的承诺来解决问题。
function listFiles (){
return new Promise((resolve, reject) => {
setTimeout(() => {
const path = require('path');
const fs = require('fs');
const { exit } = require('process');
const directoryPath = path.join(__dirname, '../');
console.log('List of Avaialble Files :');
fs.readdir(directoryPath, { withFileTypes: true },function (err, files) {
if (err) {
console.log('Unable to scan directory: ' + err);
reject(err);
}
files.forEach(function (file) {
if (file.isFile()){
console.log(file);
}
});
resolve();
});
arg='pass'
thirdJob();
}, 2000)
})
}
请注意在完成循环后添加的对 resolve
的调用。
在 readdir
返回错误的情况下,我还添加了对 reject
的调用,因为这是使用您的手动承诺传播它的正确方法。
还有一些提示,通常在文件顶部需要模块一次,而不是在函数内部动态调用。这样做的代价还不错,需要的模块有一个缓存。这只是不惯用语。
if (arg='pass'){
不做任何相等性检查,那是一个赋值,你需要 ==
,或者 ===
如果你想检查是否相等。