Tag: 承诺

原生JS Promise的这种用法是否会导致Node.js中的内存泄漏?

这里是我有的代码的示例代表。 我有一个UDP接收器,它会连续收到大量的数据包。 这是股市现场数据。 这应该给一些关于数据包量的想法。 根据收到的数据,更新到一个MySQL数据库和另一个到MongoDB。 然而,这个代码泄漏内存就像任何东西,并在大约12分钟内与7.5GB内存的EC2机器上的OOM错误崩溃。 这个崩溃是非常一致的。 我读了几个关于与Promise链接或recursion调用Promise相关的内存泄漏的stackoverflow问题和github问题。 我觉得我的代码不适合这个描述,因此想知道这个代码是否也会导致内存泄漏。 当我将这整个代码改变为没有Promises和callback的时候,内存消耗接近1%。 没有泄漏。 我正在使用当前稳定版本的Node.js(v6.9.5 LTS)。 使用原生Promise,没有像Bluebird这样的库 const dgram = require('dgram'); const receiver = dgram.createSocket('udp4'); const myObject = require('./myObject.js'); receiver.on('message', function(payload, sender) { myObject.processPayload(payload); }); receiver.bind(PORT); // In mObject.js var myObject = { processPayload: function(payload) { var updateDoc = doSomethingToPayload(payload); // Mongo npm package offers APIs which return […]

承诺 – 未处理的拒绝挂起请求

我在Node.js中开发一个后端应用程序,遇到以下问题:开发人员调用如下所示的promise函数: mainRouter.get("/xD", async (req, res) => { res.send(await this.fooService.foo()); }); 有可能this.fooService.foo()函数将失败(承诺拒绝),最终用户将得到请求超时。 我想确保开发人员的错误不会导致UnhandledPromiseRejectionWarning(最后超时错误)。 问题是如何configuration应用程序来logging错误,并在出现UnhandleRejection时将状态500返回给用户。 我试过的: mainRouter.get("/xD", async (req, res) => { try { res.send(await this.fooService.foo()); } catch (err) { res.status(500).send("error"); } }); 上面的代码会做的事情,但开发人员要求在每个路线上面写代码,所以这不是一个干净的解决scheme。 我也试图使用错误中间件: mainRouter.use((err:any, req, res, next) => { console.log(err); res.status(500).send("Error"); }); 但是没有收到PromiseRejection 最后,我创build了注册unhandledRecejtion事件的函数处理程序的中间件: mainRouter.use((req, res, next) => { process.on('unhandledRejection', (reason, p) => { console.log(reason); […]

摩卡柴Sinontesting无法访问的承诺/asynchronous/事件发射器

我的设置使用了chai , sinon , chai-sinon , chai-as-promised , babel和es6语法。 我有以下(减less)的代码 // example.js 'use strict'; import EventEmitter from 'events'; class Dispatcher extends EventEmitter { send(x) { doSomethingAsync() // promise is NOT returned .then(() => { this.emit('sent'); }) .catch((err) => { this.emit('error', err); }); } } 注意:doSomethingAsync的承诺不会返回。 (永远不会) 这是我的(减less的)testing文件 let dispatcher; let onSent; let onError; beforeEach(() => […]

为什么浏览器返回意外的input结束时,我可以从浏览器获取API响应?

我有一个非常基本的反应前端和一个非常基本的nodejs服务器。 我试图validation服务器上的用户名和密码,当客户端点击提交,然后最终redirect到他们的仪表板。 现在我无法发送用户数据请求了。 这是我在服务器上非常基本的身份validationfunction,身份validation和searchusers等function不是asynchronous的。 // Authorization app.get('/auth/:userId/:hash', function(req, res){ var id = req.params.userId.toString(); var hash = req.params.hash.toString(); var error = { err: 'something went wrong!' } var user = dm.searchUser(id, users); if (!user){ res.json(error); } var isAuthenticated = dm.authenticate(user, hash); if (!isAuthenticated){ res.json(error); } if(isAuthenticated){ console.log('authed') res.json(user); } }); 这是处理表单提交行为的客户端反应组件方法。 submit(e){ e.preventDefault(); const BASE_URL = […]

如何使用摩卡在reactjs中testing这个asynchronous方法调用

// Balance.jsx … updateToken () { const parseResponse = (response) => { if (response.ok) { return response.json() } else { throw new Error('Could not retrieve access token.') } } const update = (data) => { if (data.token) { this.data.accessTokenData = data } else { throw new Error('Invalid response from token api') } } if (this.props.balanceEndpoint […]

为什么VS代码在Promise中拒绝处理exception?

拿这个代码,我们有一个承诺,调用一个失败的函数,它应该把错误传递给承诺的catch方法。 从terminal上跑时它工作得很好。 但是,当通过vscode运行时,它在(1)处爆炸。 function failingFunc() { let undef = undefined; return undef.nope(); } let promise = new Promise((resolve, reject) => { resolve(failingFunc()); // (1) Explodes when run from vscode }); promise.then(v => {}).catch((e: Error) => { console.log(e.message); // (2) Prints when run from the terminal }); 为什么是这样? 关于页面的vscode: 版本1.14.2 提交cb82feb date2017-07-19T23:26:08.116Z 壳牌1.6.6 渲染器56.0.2924.87 节点7.4.0

在Node.js的另一个文件中同步使用返回值

我通过一个帮助文件连接来自一个已定义用户的tweets,并尝试在我的server.js中检索它,但是那里的str值仍然是未定义的(并且这条线首先被执行),然后我的帮助者的console.log用正确的价值。 输出: GET / login / twitter / callback 302 618.242 ms – 0 服务器中的连接Tweets:未定义 助手级联推文:testing鸣叫3 #TestTweettesting鸣叫2testing鸣叫1 任何人都可以帮助我应该使用什么控制stream来调用twitterHelper.getTweets函数来获取服务器中返回的str? 谢谢! Server.js app.get('/login/twitter/callback', passport.authenticate('twitter', {failureRedirect: "/login"}, function(req, res) { // auth success async.waterfall ([ function(callback) { callback(null, twitterHelper.getTweets(user)); }, function(str, callback) { console.log("Concatenated Tweets in Server: " + str); callback(null); } ], function(err) { if(err) console.log("Error: " […]

Node.js – promisify readline

正如标题所述,我想知道在node.js中是否可以使用promisify ( https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original )作为readline ? 我只能这样做: let data = []; const parse = () => { return new Promise((resolve, reject) => { const rl = readline.createInterface({ input: fs.createReadStream(path) }); rl.on('line', (line) => { data.push(line); }); rl.on('close', () => { resolve(data); }); }); };

正确地使用Promise和Await / Async

我在理解Promisefunction如何工作时遇到了一些问题,我以前使用过Bluebird,但是我想尝试学习新的await / async标准以提高程序员的性能。 我已经使用了asynchronous/等待,并在适当的地方创build了承诺,但是这些function仍然不按顺序执行。 我正在使用Webpack的最新版本的Node上运行这个,我没有得到任何有意义的错误。 它运行得很好,不像预期的那样。 运行它时我的输出是: Searching the Web for: Test String Web search Completed! Promise { <pending> } Response Handler Completed! 理想情况下,我希望它回应: Searching the Web for: Test String Response Handler Completed Web search Completed 然后返回我的响应处理程序的输出。 有谁能发现我的错误? const https = require('https'); // Replace the subscriptionKey string value with your valid subscription key. const subscriptionKey […]

节点:async.foreach失败时,错误未捕获exception被抛出

我在async.forEach构造中包装了一些asynchronous执行的“子”函数(来自伟大的lib: https : //github.com/caolan/async ) 当这些子函数之一发生未捕获的exception时,整个节点进程就会挂起。 (因为callback永远不会返回到async.forEach构造,async.forEach仍然认为子function很忙) 不过,我会认为,至less抛出的exception会起泡,因为我没有抓到任何地方。 有没有办法configurationasync.forEach如何处理这些exception? 这是非常困难的编程。