模块出口承诺履行完成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块出口承诺履行完成相关的知识,希望对你有一定的参考价值。

因为-v 8.9.3

我有自己的模块,它是另一个模块的一部分,如下所示:

module.js

function module(name) {
    request(['arr_result1', 'arr_result2', 'arr_result3'], {params, name}) //it's not actual request, I just rename it, 'name' is the same as function
        .then(response => {
            let data = [];
            data.name = response.data.arr_result1;
            data.guild = response.data.arr_result2;
            data.check_sum = 0;
            for (let i = 0; i < 3; i++) {
                data.check_sum += adler32.sum(new Buffer((response.data.arr_result3)));
            }
            return (data);
        })
        .then(data => {
            if (data.arr_result2 === undefined) {
                data.arr_result2 = 'TEST';
            } else {
                data.arr_result2 = data.arr_result2;
            }
            //other logic 
            console.log(data);
            return data;
        })
        .catch(function (error) {
            console.log(error )
        });
    }

module.exports = module;

我想通过以下方法将此'request-promise'的结果(来自console.log的'data')导入另一个文件(如app.js):

app.js

const module = require("./module");

我的模块工作正常,(console.log打印我想要的确切数据)但我无法通过import或require从另一个* .js访问数据:在这种情况下:

let data = module('name');
console.log(data);

我收到数据 - 未定义(因为请求是承诺而且还没有完成,我是对的吗?)

但是当我尝试:

module('name').then((data=> {console.log(data)});

我有错误:TypeError:无法读取未定义的属性'then'

那么我做错了什么,我该如何重写呢?实际上它是如何工作的,我指向/定义函数('name'),模块通过异步请求提供一个nessesary数据。然后将其返回'app'js P.S.Actually我重命名代码中的每个变量以获得更好的解释。在我自己的情况下,它不是一个'请求',我的模块有另一个名称。

UPDATING

是的,我已经尝试过了

function module(name) {
    return request(['arr_result1', 'arr_result2', 'arr_result3'], {params, name})

和'数据'打印很好,但为什么这个代码不能正常工作?

module('name').then(data => {
    console.log(data); //prints succesfully
    mongoose_schema-DB.create({data});
});

(node:17964)UnhandledPromiseRejectionWarning:未处理的promise拒绝(拒绝id:1):ValidationError:**这里是验证错误,就像根本没有数据一样,但是console.log将数据集打印为'ok'[DEP0018] DeprecationWarning:Unhandled承诺拒绝被弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。

这是mongoose_schema-DB代码:

让mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/dma', { useMongoClient: true });
mongoose.Promise = global.Promise;
//schema itself
let mongoose_schema-DB= mongoose.model('mongoose_schema-DB', schema);
module.exports = mongoose_schema-DB;

或快递中的这一部分

app.all('/item', function (req, res, next) {
   module('name').then(data => {
        mongooseDB_schema-DB.create({data});
    });
  },function (err, res) {
    if (err) return handleError(err);
    console.log(res);
  });
  next();
});

更新

和最有趣的部分,这段代码工作正常,而不是简单的mongooseDB_schema-DB.create({data})

module(name).then(data => {
    mongooseDB_schema-DB.create({
        field1: data.1,
        field2: data.2,
        field3: data.3,
        field4: data.4,
        field5: data.5,
        field6: data.6,
    });
});

我正在检查它的Express版本......

我只是用回调重写快速版本,而不是.catch。不知道如何,但它工作正常。感谢所有@Bergi和@Keith提供的nessasry支持!

答案

是的,这是一个承诺,你需要像你尝试过的那样使用.then等待它,但你还需要return承诺你的module功能!

function module(name) {
    return request(['arr_result1', 'arr_result2', 'arr_result3'], {params, name})
//  ^^^^^^
    .then(…)
    .then(…)
    .catch(…);
}

您可能还想省略catch并让模块的调用者处理错误,而不是接收undefined处理程序结果。

以上是关于模块出口承诺履行完成的主要内容,如果未能解决你的问题,请参考以下文章

履行承诺

有没有办法判断 ES6 承诺是不是被履行/拒绝/解决? [复制]

将 RN 项目从 0.46.4 升级到 0.60.0 并在 VSCode 中运行 结果无法从任何承诺中获得履行价值,所有承诺都被拒绝

与蓝鸟的承诺链阵列

给自由程序员的工作建议技巧

承诺回调返回承诺