【问题标题】:calling a variable from outside a callback nodejs从回调nodejs外部调用变量
【发布时间】:2019-01-15 22:54:15
【问题描述】:

我使用来自 npm 的 glob

gl = require("glob");
get = {};
gl("path/to/files/*.rmd", {}, function(err, files){
     get.files = files
 });
console.log(get.files)

output: undefined

我试图做的是从其回调外部访问文件。但是,我尝试的一切都不起作用。

【问题讨论】:

  • 你有没有尝试 console.log 进入你的回调文件的内容?

标签: node.js glob


【解决方案1】:

使用 glob.sync 可用于进行同步调用

gl = require("glob");
let get = {};
get['files']=gl.sync("path/to/files/*.rmd", {});
console.log(get.files)

参考:sync call glob.sync

【讨论】:

    【解决方案2】:

    从内部函数引用外部变量是完全可以接受的,这就是 JS 如此特别的原因。这叫做闭包。

    但问题是globasynchronous,这意味着它将在完成实际的全局搜索之前运行console.log

    所以你可以做的是你可以在回调中console.log 它。或者做出一个承诺,并在then 函数中使用console.log。或者您可以使用async/await 并等待该功能。

    const gl = require("glob");
    const get = {};
    gl("./*.js", {}, function(err, files){
         get.files = files
         console.log(get);
    });
    // OR
    const glP = function(){
        return new Promise((res, rej)=>{
            gl("./*.js", {}, function(err, files){
                if(err) rej(err);
                res(files);
           });
        })
    }
    
    glP()
    .then((files)=>{
        get.files = files;
        console.log(get);
    })
    
    // OR
    (async ()=>{
        const files = await glp();
        get.files = files;
        console.log(get);
    })
    

    【讨论】:

      【解决方案3】:

      由于async 回调的性质,您的console.log(get.files) 将在调用glob() 的回调函数之前被调用。上面的答案很好。我将再添加一个答案。

      'use strict';
      
      const glob = require('glob');
      const bluebird = require('bluebird');
      
      const globPromise = bluebird.promisify(glob);
      let get = {};
      globPromise("./files/*.rmd", {})
        .then((files) => {
          console.log(files);
          get.files = files;
          console.log(get.files);
        });
      

      上面的代码Promisify整个glob NPM 包并为你提供了执行异步任务的能力。在您自己的代码中,您应该在回调函数中编写您的 console.log(),或者您可以使用 Promises,这将确保您在 glob 完成工作后被调用。

      【讨论】:

        猜你喜欢
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多