【问题标题】:nodejs - Function Return Not Exitingnodejs - 函数返回不退出
【发布时间】:2015-01-01 23:55:38
【问题描述】:

我有一个执行一系列测试的函数。如果第一次测试失败,函数应该退出,但它不会:

function checkSite(site) {
console.log("Checking if site is already processed or processing");
// Processed Sites
fs.readFile("processed.txt", "utf8", function(error, data) {
 if (data.indexOf(site) > -1) {
  console.log("Processed");
  return "Processed";
 } else {
  console.log("Not Processed");
 }
});
fs.readFile("processing.txt", "utf8", function(error, data) {
if (data.indexOf(site) > -1) {
 console.log("Processing");
 return "Processing";
} else {
 console.log("Not Processing, Queue for Processing");
 // Queue for Processing
 fs.appendFile(fileProcessing, site, function (err) {
  if (err) throw err;
  console.log('The "data to append" was appended to file!');
 });
}
});
return "Success";
}

我收到“已处理”的控制台输出,然后是“正在处理”。我永远不应该在那里看到带有退货的“处理”。我在这里错过了什么?

【问题讨论】:

  • 您是否认真编码每个缩进级别一个空格?
  • 不,这是我从终端复制时的格式。

标签: node.js return


【解决方案1】:

return "Processed" 只是从回调函数返回,而不是从checkSite() 返回,因此它不会影响接下来发生的事情。

fs.readFile() 是异步的。如果您希望第二个 fs.readFile() 等待第一个完成,或者您不希望在第一个 fs.readFile() 成功完成后不执行进一步的操作,则必须以不同的方式编写代码。

这是一种方法:

function checkSite(site) {
    console.log("Checking if site is already processed or processing");
    // Processed Sites
    fs.readFile("processed.txt", "utf8", function(error, data) {
        if (data.indexOf(site) > -1) {
            console.log("Processed");
        } else {
            console.log("Not Processed");
            fs.readFile("processing.txt", "utf8", function(error, data) {
                if (data.indexOf(site) > -1) {
                    console.log("Processing");
                } else {
                    console.log("Not Processing, Queue for Processing");
                    // Queue for Processing
                    fs.appendFile(fileProcessing, site, function(err) {
                        if (err) throw err;
                        console.log('The "data to append" was appended to file!');
                    });
                }
            });
        }
    });
}

注意:您不能直接从checkSite() 返回成功或失败结果,因为fs.readFile() 操作是异步的,因此checkSite() 在这些操作完成之前返回。如果您想将结果传回给checkSite() 的调用者,那么您需要传入一个使用结果调用的回调函数,使用 Promise 的结构来帮助您,或者改用同步函数异步版本(通常不推荐)。

【讨论】:

  • 我试图避免嵌套我的 if/else 语句。显然不是。谢谢!
  • 如果您想避免多层嵌套,请使用 Promise 链接顺序操作。
  • 你能添加一个在这个场景中使用 Promise 的例子吗?我很难理解这些概念。
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 2018-04-29
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多