Articles of asynchronous

如何在JavaScript中parsing后立即处理asynchronous结果?

我有一个asynchronous函数需要相当多的时间来callback,需要运行一个input数组,并将结果传递给后续操作。 我最初的方法是基于Promise的: Promise.all(entries.map((entry) => { return new Promise((resolve, reject) => { processEntry(entry, resolve); }); })).then((outputs) => { outputs.forEach((output) => { return console.log(output); }); callback(); }); 与此有关的问题是,输出只在得到解决之后得到处理(或在这种情况下logging)。 为了让他们尽快解决问题,我尝试了这种更老式的方法: var i = 0; entries.forEach((entry) => { processEntry(entry, (output) => { console.log(output); if (++i >= entries.length) callback(); }); }); 这适用于我特殊的情况,但似乎不是一个正确的通用解决scheme,因为不再保证输出顺序。 为了达到预期的效果,至今我可以想到的最好的方法是在entries填入输出为原始索引的数组,并且每当新的输出出现时,就用数组的起始处理输出单独的滑动索引,当它达到一个undefined时候停止。 有没有更好的方法来实现这一目标?

数组中的NodeJs itemvariables只取得for循环中的第一个值

我正在使用expressJs路由一些POST请求。 从客户端传递对象的对象,然后在服务器中用for循环遍历每个对象。 我的问题是,循环中的variablescantidad只取第一个值,而不是刷新到pool.query ,而是在pool.query之前pool.query正确的值。 所以,下面的行是好的。 console.log("cantidad before query: " + cantidad); 但是下面的线是不好的。 它有第一个价值。 console.log("cantidad in query: " + cantidad); 这是我的代码的一部分。 for (var key in objects) { if (objects.hasOwnProperty(key)) { … console.log("cantidad before query: " + cantidad); pool.query(qProducto,idProducto, function (error, results, fields { if (error) { … } else { console.log("cantidad in query: " + cantidad); […]

Node.js:fs.readdir不会返回由fs.writeFile写入的文件

我的应用程序 一个简单的Node.js http服务器,它通过调用POST /deploy在给定的目录中创build文件。 在写入文件后,我想使用console.log列出该目录中的所有文件。 为了创build文件( POST /deploy ),我打电话给: fs.writeFile(filename, content, 'utf8', callback(null, {'newFile': filename})); callback函数写入HTTP响应,并使用以下命令列出文件: fs.readdir(some_directory, (err, files) => { files.forEach(file => { console.log(file); // Do something with the file } } 我的问题 新文件没有在callback中列出。 只有在我再次调用部署之后,才会列出上一个文件。 例如,如果我使用/deploy连续创build文件a和b ,则仅在创buildb时列出b ,并且在进行另一次调用之前b不会列出。 我假设在调用callback函数时文件没有closures,只有在稍后调用fs.readdirclosures后fs.readdir看到文件。 我怎样才能调用callback函数只有在文件被正确closures,并可以使用fs.readdir列出? 我试过了什么 阅读fs.close()手册。 它工作,但需要一个fd ,而不是文件名,所以我必须打开文件只是为了closures它,这似乎很麻烦: fs.open(fd,write,buffer){fs.cln(fd,callback(null,{'newFile':filename })); }); }); 在SO中寻找类似的问题

NodeJS:阻塞作业的asynchronous映射

让我们举一个例子,我有一个巨大的数组被串化的JSON。 我想遍历这个数组,并使用JSON.parse(阻止事件循环)将所有string转换为JSON。 var arr = ["{…}", "{…}", … ] //input array 这是第一种方法(可能会阻塞事件循环一段时间): var newArr = arr.map(function(val){ try{ var obj = JSON.parse(val); return obj; } catch(err){return {};} }); 第二种方法是使用async.map方法(与第一种方法相比,这会更有效吗?): var newArr = []; async.map(arr, function(val, done){ try{ var obj = JSON.parse(val); done(null, obj); } catch(err){done(null, {});} }, function(err, results){ if(!err) newArr = results; } ); 如果第二种方法相同或几乎相同,那么在node.js中这样做的有效方式是什么? […]

回环asynchronous/等待UnhandledPromiseRejectionWarning问题

在回环3当我实现asynchronous/等待在前保存操作挂钩 Entry.observe('before save', async (ctx, next) =>{ if(ctx.instance.images){ Entry.upload(ctx.instance.images[0].src).then(data => { ctx.instance.image = data; }); } }); 控制台打印这个错误 (node:29323) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Callback was already called. (node:29323) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero […]

我应该如何在Javascript中使用node.js和Mongodb实现asynchronousfunction?

到目前为止,我已经看到,有setTimeout() , process.nextTick(function)的asynchronousfunction,但我不知道如何使用它。 我试过我的代码,因为我现在需要一个asynchronousfunction,但它将Can't set headers after they are sent. 这是我的代码: var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost:27017/myproject'; var updateRecord = function(db, req, callback) { db.collection('documents').updateMany({ 'Item Description': req.body.itemDescrip }, { $set: { 'Issued QTY': req.body.issueQty } }, function(err, results) { if (err) return callback(err); console.log('Done'); console.log(results); var cursor = db.collection('documents').find({ 'Item Description': req.body.itemDescrip, […]

为什么在express路由中调用next()是可选的?

在Nodejs / Express的许多例子中,我看到在成功的情况下调用next()是可选的。 exports.postLogin = (req, res, next) => { passport.authenticate('local', (err, user, info) => { if (err) { return next(err); } req.logIn(user, (err) => { if (err) { return next(err); } req.flash('success', { msg: 'Success! You are logged in.' }); res.redirect(req.session.returnTo || '/'); }); })(req, res, next); }; 而且,在args中nextcallback也很容易: exports.postLogin = (req, res) => […]

我怎样才能访问其他尝试块try块中的variables?

http://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript/在这个链接中,有一些代码可以在try catch中访问一个variables,但是当我尝试在我的服务器这是不行的,因为它超出了范围。 我怎样才能做到这一点? try { const foo = "bar" } catch (e) { console.log(e) } try { console.log(foo) -> is not defined } catch (e) { console.log(e) }

testing一个then()块内的代码

所以我使用React和Mocha / Chai / Enzyme / Sinon进行testing。 我有很多asynchronous调用在我的组件,我想testing后来的代码,但不知道如何。 所以例如这是我的AddToCart组件内的reserveSession()方法: reserveSession() { this.props.reserveExam(id).then((json) => { // Code I want to test }).catch(…); } 这是我testing的当前设置: describe('AddToCartButton', () => { beforeEach(() => { props = { // set all props to empty or () => null } wrapper = mount(<AddToCartButton {…props} />) }); }); 所以我发现到目前为止,当我嘲笑this.props.reserveExam在每个之前,因为它不曾调用实际的function,它永远不会调用当时的代码,但如果我只是调用该方法不明白那是什么。 任何想法如何testing? 谢谢!

Nodejsasynchronous执行

我正在与我公司的数据库工作,我正在尝试build立一个路线。 我得到的数据是1000个值的JSON数组。 这里的function – router.get('some_route', function(req, res, next){ var ress = []; var name = req.params.name; baWelcomeController.autoComplete(name).then(function(succ){ var x = Object.values(succ[0][0]); res.status(200).send(x); }).catch(function(err){ res.status(404).send(err); console.log("error in router.get", err); }); }); 现在看看我的代码的object.values部分,从互联网我知道它的一个O(n)函数,所以nodejs应该推入到调用堆栈,同时执行其他function,但发生了什么是我得到预期的回应。 succ []中的值的数量是1000,所以我写了另一个函数注释Object.values,并写一个for循环, router.get('some_route', function(req, res, next){ var ress = []; var name = req.params.name; baWelcomeController.autoComplete(name).then(function(succ){ var x = 0; for(var i = 0; i […]