Node.js 从回调节点外部调用变量

Node.js 从回调节点外部调用变量,node.js,glob,Node.js,Glob,我正在使用npm的glob gl = require("glob"); get = {}; gl("path/to/files/*.rmd", {}, function(err, files){ get.files = files }); console.log(get.files) output: undefined 我试图做的是从它的回调外部访问这些文件。但是,我尝试的一切都不起作用。从内部函数引用外部变量是完全可以接受的,见鬼,这就是JS如此特殊的原因。这叫做结束 但是问题

我正在使用npm的glob

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

output: undefined

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

从内部函数引用外部变量是完全可以接受的,见鬼,这就是JS如此特殊的原因。这叫做结束

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

因此,您可以做的是
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);
})

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

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

Ref:

由于回调的
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(),或者您可以使用承诺来确保您将被调用一次
glob
,这样做是正确的。

您是否尝试将文件的内容console.log记录到回调函数中?