相关疑难解决方法(0)

用EventEmitter写异步函数

我是节点中的新手,并尝试在节点中使用异步和事件行为优势.我曾经从节点理解,处理Event对象的一切,它将是异步执行.
然后我尝试了这个,考虑以下代码:

var events = require("events");

var event = new events.EventEmitter();


event.on("work", function () {

    for (var i = 0; i <= 10; i++) {
        console.log("I do my work " + i);
    }

    event.emit("done");
});

var async = function (cb) {

    event.on("done", cb);
    event.emit("work");
    for (var i = 0; i <= 10; i++) {
        console.log("Async " + i);
    }
}


async(function () {
    console.log("I am done callback!");
});  
Run Code Online (Sandbox Code Playgroud)

这是异步执行?在我看来没有!为什么,因为我读了很多这句话:

事件被解雇了,所以去做一些事情,然后当你完成它,回来告诉我,但同时我会做别的事情.

喜欢快餐店的场景.但是上面的代码,当事件工作将被解雇时,将发生以下顺序:

  1. 进入回调
  2. 让我们通过循环
  3. 输出我做我的工作
  4. 解雇完成事件
  5. 输出我完成了回调!
  6. 输出异步n

为什么我做完回调!要在Async n之前输出吗?为什么这里不像快餐店的场景一样

工作事件被触发,去你做什么并且当你完成后回来,同时我将输出Async …

javascript asynchronous node.js

15
推荐指数
1
解决办法
1万
查看次数

在事件发射器中使用异步

在尝试在事件内进行异步调用时遇到了挑战。

这是来自Nodemailer的代码-我在需要进行异步调用的行中添加了这一行:

let transporter = nodemailer.createTransport({
    SES: new aws.SES({
        apiVersion: '2010-12-01'
    }),
    sendingRate: 1 // max 1 messages/second
});

// Push next messages to Nodemailer
transporter.on('idle', () => {
    while (transporter.isIdle()) {

        // I need to make an async db call to get the next email in queue
        const mail = await getNextFromQueue()

        transporter.sendMail(mail);
    }
});
Run Code Online (Sandbox Code Playgroud)

我发现了这篇文章建议进行一些有意义的切换,但是我无法正确地将其应用于此。

更新 -答案是使用Sinon模拟sendMail。

asynchronous node.js eventemitter

1
推荐指数
1
解决办法
4509
查看次数

标签 统计

asynchronous ×2

node.js ×2

eventemitter ×1

javascript ×1