在node.js

时间:2017-10-12 17:21:58

标签: javascript node.js async-await

我的自定义模块包含以下代码:

module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}

如果在我的模块外部调用函数,它工作正常,但如果我调用内部运行时出错:

  

(node:24372)UnhandledPromiseRejectionWarning:未处理的承诺   rejection(拒绝id:1):ReferenceError:PrintNearestStore不是   定义

当我将语法更改为:

module.exports.PrintNearestStore = PrintNearestStore;

var PrintNearestStore = async function(session, lat, lon) {

}

它开始在模块内部工作正常,但在模块外部失败 - 我收到错误:

  

(node:32422)UnhandledPromiseRejectionWarning:未处理的承诺   rejection(拒绝id:1):TypeError:mymodule.PrintNearestStore是   不是一个功能

所以我把代码更改为:

module.exports.PrintNearestStore = async function(session, lat, lon) {
    await PrintNearestStore(session, lat, lon);
}

var PrintNearestStore = async function(session, lat, lon) {
...
}

现在它适用于所有情况:内部和外部。但是想要了解语义,是否有更美观,更短的写作方式?如何正确定义和使用 async 功能:内部和外部(导出)模块?

4 个答案:

答案 0 :(得分:38)

这与异步函数没有任何关系。如果要在内部调用函数将其导出,请先将其定义为 ,然后将其导出。

async function doStuff() {
  // ...
}
// doStuff is defined inside the module so we can call it wherever we want

// Export it to make it available outside
module.exports.doStuff = doStuff;

您尝试的问题的说明:

module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}

这不会在模块中定义一个功能。函数定义是函数表达式。函数表达式的名称仅在函数本身内创建变量。更简单的例子:

var foo = function bar() {
  console.log(typeof bar); // 'function' - works
};
foo();
console.log(typeof foo); // 'function' - works
console.log(typeof bar); // 'undefined' - there is no such variable `bar`

另见Named function expressions demystified。如果你在任何地方都引用module.exports.PrintNearestStore,你当然可以参考这个函数。

module.exports.PrintNearestStore = PrintNearestStore;

var PrintNearestStore = async function(session, lat, lon) {

}

几乎确定。问题是,PrintNearestStore的值在undefined分配时为module.exports.PrintNearestStore。执行顺序是:

var PrintNearestStore; // `undefined` by default
// still `undefined`, hence `module.exports.PrintNearestStore` is `undefined`
module.exports.PrintNearestStore = PrintNearestStore;

PrintNearestStore = async function(session, lat, lon) {}
// now has a function as value, but it's too late

更简单的例子:

var foo = bar;
console.log(foo, bar); // logs `undefined`, `undefined` because `bar` is `undefined`
var bar = 21;
console.log(foo, bar); // logs `undefined`, `21`

如果您更改了订单,它将按预期工作。

module.exports.PrintNearestStore = async function(session, lat, lon) {
    await PrintNearestStore(session, lat, lon);
}

var PrintNearestStore = async function(session, lat, lon) {
...
}

这是有效的,因为时间分配给module.exports.PrintNearestStore 的函数被执行PrintNearestStore将函数作为其值。

更简单的例子:

var foo = function() {
  console.log(bar);
};
foo(); // logs `undefined`
var bar = 21;
foo(); // logs `21`

答案 1 :(得分:2)

第一种情况出错:PrintNearestStore - 函数表达式,因此该名称在外面不可用。

第二种情况的错误:使用变量,而不是函数声明。在这种情况下,变量PrintNearestStore的声明被提升,因此,您可以在行var PrintNearestStore = ...之前使用此名称​​,但在这种情况下,值将是 undefined 。< / p>

因此,最简单的解决方案会改变第二种变体:

module.exports.PrintNearestStore = PrintNearestStore;

async function PrintNearestStore(session, lat, lon) {

}

答案 2 :(得分:1)

export let handlePostStore = async (data) => {
    console.log('post');
    return data;
};

// to import 
import { handlePostStore } from 'your_path_here';

// to call it 
handlePostStore(data)

答案 3 :(得分:0)

一些例子:

module.exports.func1 = async function func1(id) {  // name is preferred by linter
  //
};

module.exports.func1 = async function (id) { // ok
  //
};

module.exports.func1 = async (id) => { // simpler
  //
};