从回调node.js外部调用变量

时间:2018-08-08 15:40:52

标签: 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

我想做的是从其回调外部访问文件。但是,我尝试的所有方法都无法正常工作。

3 个答案:

答案 0 :(得分:1)

从内部函数引用外部变量是完全可以接受的,这使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);
})

答案 1 :(得分: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 :(得分:0)

由于回调的性质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 NPM软件包的代码glob上方,并为您提供了执行异步任务的能力。在您自己的代码中,您应该在回调函数中编写console.log(),或者可以使用Promises来确保一旦glob起作用后您就会被调用。