Articles of asynchronous

如何强制for循环等待callback完成在nodejs?

entry.find(function(err,user){ for(var i=0;i<user.length;i++){ if(user[i].tablenumber==-1){ assigntable(user[i]); } } }); 所以我在这里要做的是在调用asynchronousassigntable函数之前等待每个for循环完成。 Assigntable是对数据库进行更改的callback。 我现在的问题是,因为asscomntable的callback是在for循环完成后调用的,所有的用户都会被分配到表1中。但是我想要的是:将第一个分配给表1 – >在下一个循环中分配表1被分配 – >用户2被分配到表2等等。 我怎么做? 编辑:Assgintable是一个recursion调用,在callback中编辑数据库。 更新将基于从前一个循环产生的数据库的结果,但我没有在这里相关。 function assigntable(user,tableindex){ console.log("in recursion with tableindex"+tableindex); if(tableindex==3) return; console.log(user.date+user.time+tableindex); entry.find({ $and: [ { "tablenumber": tableindex}, { "date": user.date }, {"time":user.time} ] },function(err, result) { if(result.length==0){ console.log(result+"result is "); entry.update({"_id":user._id},{"tablenumber":tableindex},function(err, numberAffected) { if(!numberAffected){ } else { console.log("entryupdated with […]

Async循环与mongodb nodejs

我在MongoDb有2个集合: 用户和图像 用户是这样的: { "_id": ObjectID("58299fc14705d47ff852f8ae"), "mail": "Qwerty1@test.test", "username": "Qwerty1", "token": "g8m7h0phrvhp774cw0xh9qkt9rhu062r2b3gigm0t1o22zkt9", …, "images": [ ObjectID("582c547bb7c5cc391e5a1793"), ObjectID("582c54ecb7c5cc391e5a1794") ] } 图像就像: { "_id": ObjectID("582c5394b522cb37d701dbe3"), "user": "g8m7h0phrvhp774cw0xh9qkt9rhu06 "image": base64 encoded } 我在用户find这个用户的图像的id,我想填充一个数组(b64Images)与查找请求图像收集。 db.collection("users").find({$or : [{ username: req.params.username }, {token : req.params.username}]}).toArray(function (err, result) { if(result.length){ var b64Images = []; async.each(result[0].images, function(item, callback){ db.collection("images").find({_id : item}).toArray(function (err, resulta) […]

返回数据一旦获取JavaScript

使用nodeJS。 我有一个主要的文件,调用一个Web刮板,出去几个链接,并从网站获取原始数据,然后下一行调用一个函数从网页刮板文件返回一个JSON对象到主文件。 但是,由于需要一点时间出去刮网站,返回正在返回一个空的对象。 在调用get方法之前,如何使用callback或其他方法来等待数据。 主文件 var test = require('web-scraper.js'); test.scrape(next); function next() { var json = test.getJSON(); } web-scraper.js(它使用模块导出并位于节点模块文件夹中) module.exports = { scrape: function(callback) { startScraper(callback); }, getJSON: function() { return JSON; } }; function startScraper(callback) { // Does web scraper stuff callback(); }

如何同步(编程)运行Grunt任务?

我想要一个在一个循环中同时运行子任务的任务,当一个子任务改变一个标志的值时,这样的循环就会被中断。 这是我正在尝试做的一个示例: grunt.registerTask('complexTask', 'Run sub-tasks synchronously.', function () { var value; do { // 'changeValueTask' task sets 'importantValue' grunt.task.run(['preTask', 'changeValueTask', 'postTask']); value = grunt.config('importantValue'); } while (!value); // … end task }); 我想从中得到什么是 确保每一组任务 ( ['preTask', 'changeValueTask', 'postTask'] )按顺序运行(依次) 并打破循环的最佳方式 有没有可能实现这个? 注意:在一些研究之后,我能find的最接近的东西是Grunt允许定义如果task A没有完成,给定的task B就会失败(用grunt.task.requires : grunt.task.requires('A') )。

了解Asycn每个

我有一个函数调用async.each通过一个数组。 在asycn.each里面有一个函数调用async.each通过第一个函数传递的数据。 var f1 = function(){ var b = [o1,o2,o3,o4,o5,o6….]; async.forEach(b, function(obj, cb){ f2(obj, function(){ cb(); }) }, function(err){ }) }; var f2 = function(obj, c2){ async.forEach(obj, function(obj2,cb){ // some db operation return dbData; cb(); }, function(){ // do asynch operation on dbData and update value in db }) }; 现在,我的疑问是,当f2完成对在f1中传递的第一个项目执行async.forEach时,将调用callback函数,而callback函数使用在f2中传递的obj执行一些操作。 但是因为这是并行执行的,所以当第一个项目的callback被调用时,它是否会有相同的obj对象继续运行,或者obj的值可能与其他asych.each任务在同一个函数上被调用的值不同。

find大量的文件,并获得节点FS的总数

我build立一个节点脚本asynchronous输出一个目录的文件数和行数; 但是,我在其asynchronous控制stream程中遇到麻烦。 // Import Dependencies const fs = require('fs'); const get_dir_line_count = (dir) => { let output = { file_count: 0, file_line: 0, path: '' }; new Promise( (resolve, reject) => { fs.readdir(dir, (err, dir_contents) => { resolve(dir_contents); }); }).then( (promise_contents) => { Promise.all(promise_contents.map( (file) => { const file_path = dir + '/' + file; […]

事件循环阻塞和节点JS中的asynchronous编程

我是节点js编程的新手,因此要非常适当地理解核心概念和实践。 AFAIK节点js具有非阻塞I / O,允许所有磁盘和其他I / O操作以asynchronous方式运行,而JS运行在使用Event Looppipe理资源和执行path的单线程中。 正如许多地方的build议,开发人员build议使用callback模式编写自定义函数/方法 function processData(inputData, cb){ // do some computation and other stuff if (err) { cb(err, null); }else{ cb(null, result); } } callback = function(err, result){ // check error and handle // if not error then grab result and do some stuff } processData(someData, callback) // checking whether execution […]

节点JS – asynchronous当我想要显示从Mongoose列表

我有一个问题,当我想显示从Mongoose(MongoDB)的数据列表到我的前端ejs 例如: var User = require("./models/user"); var Houses = require("./models/house"); app.get("/", function(req, res){ var list_houses = []; for(var i=0; i<req.user.city.length; i++) { Houses.find({'city': req.user.city[i]}, function(err, result){ if(err)console.log(err); if(result){ list_houses = list_houses.concat(result);//add array result to array list_prices } }); } res.render("/prices_houses",{list_houses: list_houses}); }); 我发现模块“asynchronous”,但都不工作,我的代码是: var User = require("./models/user"); var Houses = require("./models/house"); var async = require('async'); […]

我如何使function在后台运行?

我有这个代码定期调用loadfunction,这非常负载工作需要10秒。 问题是当load函数被执行时,它阻塞了主stream。 如果在执行load发送一个简单的GET请求(如运行状况检查),GET调用将被阻塞,直到load调用完成。 function setLoadInterval() { var self = this; this.interval = setInterval(function doHeavyWork() { // this takes 10 sec self.load(); self.emit('reloaded'); }, 20000); 我尝试了async.parallel,但仍然阻止了GET调用。 我试过setTimeout但得到了相同的结果。 如何使load在后台运行,以防止主stream? this.interval = setInterval(function doHeavyWork() { async.parallel([function(cb) { self.load(); cb(null); }], function(err) { if (err) { // log error } self.emit('reloaded'); }) }, 20000);

如何使一个ASync函数等待,直到收集到所有的信息?

getGrades() { let grades = {}; this.state.courses.map((course) => { this.state.studentDetails.map((student) => { request.get(`http://localhost:8080/user/${student.id}/grades`).then((response) => { if (response) { response.body.map((grade) => { grades[`${student.id}_${course.id}_${grade.gradeType}`] = grade.grade; }); } }); }); }); this.setState({grades: grades}); } 我想这this.setState({grades: grades}); 只有在收集到所有信息时才被调用。 我怎样才能做到这一点?