【问题标题】:How can I return value from this child function in javascript如何在javascript中从这个子函数返回值
【发布时间】:2020-05-18 21:46:09
【问题描述】:

无法从内部函数返回 dat[0] 值

let ite = fs.readdir(directoryPath, function (err, files) {
  if (err) {
    return console.log('Unable to scan directory: ' + err);
  }
  dat = files.filter(item => item[1] == files.length);
  return dat[0];
});

【问题讨论】:

  • 如果在最终返回之前在函数内部执行console.log(JSON.stringify(dat))dat 的值是多少?那将是开始调试的好地方。
  • 你能详细说明它应该做什么的功能吗?这个nodejs也不是普通的javascript,应该在你的问题中添加nodejs标签。
  • 为什么需要返回dat[0]

标签: javascript arrays node.js for-loop return


【解决方案1】:

我们可以将其作为一个 Promise 方法来异步运行代码。这里我们不阻塞任何线程。它将异步运行。

function getData(directoryPath) {
    return new Promise((resolve, reject) => {
        fs.readdir(directoryPath, function (err, files) {
            if (err) {
                reject('Unable to scan directory: ' + err.message);
            }
            dat = files.filter(item => item[1] == files.length);
            resolve(dat[0]);
         });
    });
 }

 getData(directoryPath).then((data) => {
     console.log(data);
 }).catch((err) => {
    console.error(err);
 });

 // or

 try {
     let data = await getData(directoryPath);
 } catch (error) {
     console.error(error);
 }

【讨论】:

    【解决方案2】:

    我不建议阅读sync阅读,因为它会阻塞主要的thread。您可以通过将 callback 函数作为 参数 传递给另一个函数来使用它。

     function getData(onSuccess, onError) {
         fs.readdir(directoryPath, function (err, files) {
            if (err) {
                 onError('Unable to scan directory: ' + err);
            }
            dat = files.filter(item => item[1] == files.length);
            onSuccess(dat[0]);
         });
     }
    
     getData(function(data){
         console.log(data);
     }, function(error){
         //error here
     })
    

    【讨论】:

      【解决方案3】:

      您正在从操作完成时将调用的函数返回。所以从那个函数返回不会改变你的变量的值。

      您可以使用readdirSync

      const res = fs.readdirSync(directoryPath);
      

      如果您不希望它同步,您可以使用 fs.promises 和异步等待

      let res;
      (async function() {
         res = await fs.promises.readdir("");
      })();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-27
        • 2023-02-10
        • 1970-01-01
        • 2011-04-04
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        相关资源
        最近更新 更多