在nodejs中执行异步代码

时间:2017-11-07 12:36:52

标签: javascript node.js

我对nodejs开发相对较新。我需要异步执行一个函数做一些不重要的事情,这就是我想要异步执行它的原因,比如记录no。这种方法收到的电话。记录部分对我来说并不是非常关键,也不希望它以任何方式阻碍或减慢主流量。

我考虑过像这样使用return Promise

return new Promise( /* executor */ function(resolve, reject) { ... } );

但是观察到执行程序立即开始执行,如Mozilla docs中提到的那样(虽然不确定)。

我对这种行为不感兴趣,因为在我的正常流程(调用者函数)可以继续之前,executor函数的一些计算将会运行。我知道我不应该保持计算密集的同步部分,我没有保持密集。

my flow的伪代码看起来像这样:

export let mainFunc = (req: Request, res: Response) => {
     // logic for handling the request is here
     // need to record analytic information here by calling
     recordInformation(req);
}


function recordInformation(req){
    return new Promise(function(resolve, reject) {
        //some synchronous code followed by asynchronous code
    });
}

只是我正在寻找一种方法,使调用函数mainFunc在调用recordInformation后永远不会等待一次计算。

2 个答案:

答案 0 :(得分:1)

正如MDN文档所述,传递给new Promise()的函数是同步执行的。

示例:

function temp() {
  return new Promise(function(resolve, reject) {
    console.log('This runs right away');
  });
}

temp();
temp();
temp();
console.log('This runs last');

如果要异步运行某些代码,请将其传递给.then()

function temp() {
    return Promise.resolve().then(function () {
        console.log('This runs later');
    });
}

temp();
temp();
temp();
console.log('This runs right away');

请记住,如果您想要做的只是在当前执行堆栈完成后运行一些代码,那么简单的setTimeout可能同样好:

function temp() {
    setTimeout(function () {
        console.log('This runs later');
    }, 1);
}

temp();
temp();
temp();
console.log('This runs right away');

答案 1 :(得分:0)

来自你的伪造代码;您可以回复该请求,然后再调用其他功能。这意味着您的所有请求处理(包括响应)都在您的其他函数之前执行:

export let mainFunc = (req: Request, res: Response) => {
     // logic for handling the request is here
     res.end('Hello World');
     // response is now sent, feel free to do anything else at your leisure..
     // need to record analytic information here by calling
     recordInformation(req);
}


function recordInformation(req){
    return new Promise(function(resolve, reject) {
        //some synchronous code followed by asynchronous code
    });
}