我想能够重构这个咖啡代码的error handling: # Do some stuff with 2 levels of asynchronous callbacks and error handling vote = (res, data) -> Case.findOne { caseId: data.id }, (err, mycase) -> if err console.error 'Vote failed' else myvote = new Vote case: mycase._id myvote.save (err) -> if err console.error 'Could not add vote' else console.log 'Success!' 像这样的东西: # […]
我正在尝试为C ++库编写一个nodejs绑定,我似乎遇到了一个障碍。 我正在努力使所有的C ++库的调用asynchronous,这就是为什么我使用libuv 。 我基本上是按照这个教程。 我想能够从libuv的uv_queue_work调用类成员函数。 看看这个代码 – class test { private: int data; void Work(uv_work_t *req); void After(uv_work_t *req); public: Handle<Value> Async(const Arguments& args) { HandleScope scope; Local<Function> callback = Local<Function>::Cast(args[0]); int status = uv_queue_work(uv_default_loop(), **something**, Work, After); assert(status == 0); return Undefined(); } }; 基本上我希望Work和After函数能够在类的data元素上工作。 但是,这似乎并没有工作。 我试过从types为void test::(*)(uv_work_t*)为void (*)(uv_work_t*)types指针。 但是,这似乎也没有工作。 你们可以给我一些关于如何解决这个问题的技巧吗?
鉴于node.js的asynchronous特性,我在计算variables“通过”(我知道这不是正确的术语,我将解释)时遇到了一些麻烦。 请看下面的内容: connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) { if(err) { throw err; } var solution = rows[0].solution; }); res.render('index', { title: solution }); 正如你可以想象的,我得到一个reference error, solution is not defined 。 这是因为res.render是在从mysql服务器获取解决scheme之前完成的。 一旦解决scheme被定义,我怎样才能使它呈现页面? 我知道这是一个非常小而愚蠢的事情,真的是节点的核心,但请帮助我理解。
比方说,我想发送一封电子邮件,然后更新数据库,这两个行动是asynchronous的。 这是我通常会写的。 send_email(function(err, id){ if(err){ console.log("error"); }else{ update_database(id,function(err, id){ if(err){ console.log("error"); }else{ console.log("success"); } }); } }); 我想用中间件代替它。 var mid = {}; mid.send_email = function(){ return function(next){ send_email(function(err,id){ if(err){ console.log("error"); }else{ next(id); } }); } } mid.update_database = function(){ return function(id,next){ update_database(id,function(err,id){ if(err){ console.log("error"); }else{ next(id); } }); } } mid.success = function(){ return function(id,next){ […]
我试图理解callback和asynchronous编程,但我有一些麻烦。 这是一些伪代码: var lines = []; var arrayOfFeedUrls = [url1,url2,…]; function scrape(url){ http.get(url, function(res) { res.pipe(new FeedParser([options])) .on('readable', function () { var stream = this, item; while (item=stream.read()) { line = item.title; lines.push(line); } }); }); }); for (i in arrayOfFeedUrls){ scrape(arrayOfFeedUrls[i]; } console.log(lines.length); 它显然返回0,因为刮擦function是asynchronous执行的。 我非常了解,但是我尝试了许多错综复杂的方法,无法弄清楚如何正确书写。 任何帮助/解释将不胜感激。 我已经阅读了许多教程和示例(但我仍然在阅读),但是我认为获得它的唯一方法是自己编写一些代码。 如果我解决这个问题,我会发布答案。
processItem何时开始执行。 一旦某些项目被推入队列,它是否会启动? 还是必须在队列中的第一个项目开始执行之前完成for循环? var processItem = function (item, callback) { console.log(item) callback(); } var myQueue = async.queue(processItem, 2) for (index = 0; index < 1000; ++index) { myQueue.push(index) }
有一个asynchronous函数fun(param, callback)像这样: fun(param, function(err){ if(err) console.log(err); doSomething(); }); 如何设置运行此function的时间限制? 例如,我设定的时间限制等于10秒。 如果在10秒内完成,没有错误。 如果运行超过10秒,则终止并显示错误。
对不起,我可能无法清楚地描述这个问题。 我会尝试: 现在我有一个asynchronous函数,它接受数据并做一些事情,例如 function myFunction(num: number):Promise<void> { return new Promise((resolve) => { console.log(num); return; }); } 我想在一个组中打印5个数字(顺序无关紧要)。 重要的是,我想在前面的组完成后打印下5个数字。 例如: 1, 2, 5, 4, 3, 6, 9, 8, 7, 10 … is valid 7, 10, 1, 2, 3, 4, 5, 6, 8, 9 … is not valid 如果我必须使用这个函数,我怎么能做到这一点? 我必须确定这个function的前五个调用已经解决,然后调用下面五个函数的调用。 我知道这似乎很奇怪,我试图把我目前的问题抽象成这个数字问题。 感谢您的任何意见或想法。
let val = 0; async function first() { console.log('1a', val); second(); console.log('1b', val); } async function second() { console.log('2a', val); third(); console.log('2b', val); } async function third() { console.log('3a', val); val = await new Promise(function (resolve, reject) { setTimeout(function () { resolve(3); }, 1000); }); console.log('3b', val); } console.log('0a', val); first(); console.log('0b', val); 我期待: 0a […]
当下面的函数完成并提供数组“相册”中项目的最终列表时,我希望它调用另一个函数/对列表执行其他操作。 目前它在函数完成之前发布[],我知道这是因为asynchronous执行,但我认为节点线性读取,因为它是单线程? function getAlbumsTotal(list, params){ for(var i = 0; i<list.length; i++){ api.getArtistAlbums(list[i], params).then(function(data) { for(var alb = 0; alb<data.body.items.length; alb++){ albums.push(data.body.items[alb].id); } }, function(err) { console.error(err); }); } console.log(albums); //do something with the finalized list of albums here }