【问题标题】:Export module after promise completes承诺完成后导出模块
【发布时间】:2017-10-13 04:58:30
【问题描述】:

我实际上想将“读取”函数放在不同的模块中,然后在我的主 app.js 中使用它。 (我对使用 Promise 很陌生)

[修订]

var dir = require('node-dir');
var files = function getFiles(){

        return new Promise(function (resolve, reject) {
        dir.files('../sample/sample', function (err, res){
            if (err) {
                    reject(err);
                    console.log('Oops, an error occured %s', err);
            }
            else {
                      resolve(res);
                      return res;
                  }
            });
        });
}

console.log(files);

module.exports = files;

再次更新:

//read.js

var dir = require('node-dir');
var Promise = require('promise');


module.exports = new Promise(function (resolve, reject) {
        dir.files('../sample/sample', function (error, results){
            if (error) {
                    reject(error);
                    console.log('Oops, an error occured %s', err);
            }
            else {
                      resolve(results);
                  }
            });
        })

//app.js

var filelist = require('./read');

filelist.then(function (res){

    console.log(res);
})

我该怎么做?我尝试过“return new promise ...”并将整个内容放在 getFile 函数中,但它没有返回任何内容。

我做错了什么?

【问题讨论】:

  • 这里同样重要的是你如何使用承诺。调用导出承诺的代码在哪里。 (promise.then) 那里也不需要额外的。
  • 实际上,我把那个多余的“then”去掉了,我本来打算用那个“then”来做别的事情,但我发帖的时候忘了把它去掉。我将粘贴修改后的代码。

标签: javascript node.js node-modules


【解决方案1】:

这是我的代码

read.js

var dir = require('node-dir');

var files = new Promise(function (resolve, reject) {
    dir.files('../sample/sample.txt', function (err, res){
        if (err) {
            reject(err);
            console.log('Oops, an error occured %s', err);
        }
        else {
            resolve(res);
        }
    });
});

exports.files = files;

然后在导入此模块的文件上使用它。

app.js

var read = require('read.js');

read.files.then(function(res) {
    console.log(res);
});

您修改后的代码

read.js

var dir = require('node-dir');

var files = function(){
    return new Promise(function (resolve, reject) {
        dir.files('../sample/sample', function (err, res){
            if (err) {
                    reject(err);
                    console.log('Oops, an error occured %s', err);
            }
            else {
                      resolve(res);
                      return res;
              }
        });
    });
}

exports.files = files;

app.js

var read = require('read.js');

read.files().then(function(res) {
    console.log(res);
});

希望对您有所帮助。

【讨论】:

  • 假设我将前半部分放在“read.js”中,然后在“app.js”中要求它,我如何在你的答案中调用第二部分?我粘贴了修改后的代码
  • 从我的代码中,您将在 app.js 中键入第二部分。我将更新答案,向您展示如何使用更新后的代码。
  • 感谢您的提示!一开始没看懂你在说什么,后来导出了promise,然后在app.js中require了,然后把"...then(function(res){})...在我的主应用程序中,现在它可以工作了!
  • 导出一个promise然后在app.js中要求它是常见的还是好的做法?
  • 没问题。如果有帮助,您可以标记答案。 :)
【解决方案2】:

异步/等待方法

promise-mysql 模块的示例。

connection.js

const mysql = require('promise-mysql');

const dbDev = async () => {
    return await mysql.createConnection({
        host: YOUR_MYSQL_HOST,
        user: YOUR_MYSQL_USER,
        password: YOUR_MYSQL_PASSWORD,
        database: YOUR_MYSQL_DB_NAME         
    });
}

module.exports = {
    dbDev
};

app.js

const connection = require('./connection');

const showResult = async () => {
        try {
        const con = await connection.dbDev();
        const result = await con.query(YOUR_QUERY);
        con.end();
        console.log(result);
    } catch (e) {
        console.log(e.message);
    }
}

showResult();

node-dir 模块注意事项

我知道问题是关于 promise 完成后导出模块,但如果 node-dir 模块也同步工作,也许它会帮助其他人。 p>

read.js

const dir = require('node-dir');

const files = function() {
    return dir.files(YOUR_DIR, {sync:true});
}

exports.files = files;

app.js

const read = require('./read');

try {
    const res = read.files();
    console.log(res);
} catch (e) {
    console.log(e.message);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2021-10-20
    • 2020-01-15
    • 1970-01-01
    • 2015-11-24
    • 2019-04-29
    • 2020-05-04
    • 2018-10-22
    相关资源
    最近更新 更多