Tag: callback

节点js +多个嵌套的内部函数与callback

我已经与单一函数(abcd)中的callback嵌套内部函数。 我需要使用asynchronous从外部调用abcd函数并返回响应。 var listFunctions = { test1 : function(objectData, callbackData) { //have logic and retrun data callbackData(null, "a"); }, test2 : function(objectData, callbackData) { //have logic and retrun data callbackData(null, "b"); }, test3 : function(objectData, callbackData) { //have logic and retrun data callbackData(null, "c"); }, test4 : function(objectData, callbackData) { //have logic and retrun data […]

在执行callback时,在Node.js中打破Q承诺?

请以承诺为理由,请原谅我的新手。 我在Node.js中使用Q模块 我有一个函数,一旦执行了所有必要的步骤,就会调用callback函数。 当我想从Q promise中调用callback函数时就会出现问题。 我希望的function是能够在达到最后一步时调用callback函数,而不再是承诺链中。 因此,callback将恢复到原来的操作状态。 但是,正如我编写的那样,callback在promise的上下文中被调用。 在这一点上,如果callback(比如说)抛出一个错误,它会被这个函数中的error handling程序捕获,这不是我想要的! var updateDataStream = function(data, input, posts, stream, callback) { // Pack all the items up… Q.ncall(data._packStream, data, posts, stream) // Upsert the cache into the database .then(function(){ return Q.ncall(data.upsert, data); }) // buffer the new input .then(function(res){ return Q.ncall(data.buffer, data, input); }) .then(function(final){ callback(null, final); […]

Async.js – ETIMEDOUT和callback已经被调用

当我运行index.js时,我不断收到ETIMEDOUT或ECONNRESET错误,后面跟着一个Callback was already called错误。 起初我以为是因为在调用onEachLimitItemcallbackonEachLimitItem之前我没有包含return 。 所以我将其包含在asynchronous多个callback文档中 。 仍然没有解决它。 我也尝试删除错误事件,并在错误事件中删除onEachLimit的callback,但都没有工作。 我已经看过围绕Callback already called的Callback already called问题的其他SO问题,但是由于他们不关心stream,我没有find解决scheme。 我的理解是,如果stream遇到像ECONNRESET这样的错误,它将返回错误事件中的callback,并继续到下一个stream,但似乎并不是这样。 几乎看起来,如果错误自行解决,即它重新连接,并尝试再次发送到Azure错误的蒸汽,它的工作,然后触发“完成”事件,我们得到了Callback already called的Callback already called 。 我是否正确处理stream事件中的callback? var Q = require('q'); var async = require('async'); var webshot = require('webshot'); var Readable = require('stream').Readable; var azure = require('azure-storage'); var blob = azure.createBlobService('123', '112244'); var container = 'awesome'; var countries = […]

如何实现可重用的callback函数

我相当新的JavaScript,我在节点工作,需要很好的理解asynchronous编程和callbackdevise。 我发现使用embedded式函数很容易,即使你的callback是多层次的。 您的embedded式callback只是最终被closures。 但是,如果在执行路由中有许多callback类似的callback,则最终会在不同的callback链中反复重写大量的callback代码。 例如,如果下面的mycb1和mycb2定义被移到A之外,那么它们不再具有对A的variables的隐式访问,因此不再作为闭包。 带有embedded式定义的示例,它们用作闭包。 mod.A=function(){ var mycb1=function(err){ if (!err){ var mycb2=function(err){ cb(err); }; mod.foo2(args,mycb2); } else{cb(err);} }; mod.foo1(args,mycb1); } mod.foo1 = function(args,cb){ //do some work cb(err); }; mod.foo2 = function(args,cb){ //do some work cb(err); } //execute mod.A(); 我想要做下面的事情,但是能够改变mycb1和mycb2函数的variables作用域,以便它们可以被用作closures被调用的地方。 例如: var mycb2=function(err){ … cb(err); }; var mycb1=function(err){ if (!err){ mod.foo2(args,mycb2); //but have it act […]

如何正确使用Redis和Koa(node.js)

我尝试从redis数据库获取信息,并将其作为响应的主体返回给用户。 首先,这是一个失败的代码: var redis = require("redis"), koa = require("koa"); var app = koa(), port = process.argv[2] || 3000, client = redis.createClient(); app.use(function* (next) { client.get("test", function (err, res) { this.body = res; }); yield next; }); app.listen(port); console.log("listen on port " + port) 肯定是因为收益调用在调用callback之前结束。 那么这里是一个成功的代码: function askRedit (callback) { client.get("test", callback); } app.use(function* (next) { […]

Node.js Q承诺,为什么使用defer()的时候可以使用this()?

我想做一些事情: somePromiseFunc(value1) .then(function(value2, callback) { // insert the next then() into this function: funcWithCallback(callback); }) .then(function(dronesYouAreLookingFor){ // Have a party }) .done(); 它没有工作。 我无法得到它的工作。 我被build议使用defer()来达到这个目的。 他们自己的文档说,我们应该使用延迟callback式函数。 虽然这是令人困惑的,因为他们着名的金字塔榜样都是关于callback的,但是这个例子太抽象了。 因此,我看到很多使用defer的人,那就是我所做的: somePromiseFunc(value1) .then(function(value2) { var promise = q.defer(); funcWithCallback(function(err, dronesYouAreLookingFor){ if (!err) promise.resolve(dronesYouAreLookingFor); else promise.reject(new Error(err)); }); return promise.promise; }) .then(function(dronesYouAreLookingFor){ // Have a party }) .done(); 直到我通过检查源代码发现这也起作用: […]

nodeJS中的承诺/承诺/执行顺序中的callback是不正确的

当我链接多个承诺时,我希望每个承诺只有在前一个承诺结束后才能执行。 不知何故,这并没有发生。 我确信使用承诺错误,并会喜欢一些解释… 我有这个代码: var Promise = require('bluebird'); func('A') .then(() => {func('B')}) .then(() => {func('C')}) .then(() => {func('D')}) function func(arg) { return new Promise(function(resolve){ console.log('>> ' + arg); setTimeout(function(){ console.log(' << ' + arg); resolve(); }, 200) }) } 我期待得到这个输出: >> A << A >> B << B >> C << C >> D << […]

重构嵌套的callback,node.js,async

function indexArticles(callback) { fs.readdir("posts/", function(err, files) { async.map(files, readPost, function(err, markdown) { async.map(markdown, parse, function(err, results) { async.sortBy(results, function(obj, callback) { callback(err, obj.date); }, function(err, sorted) { callback( {"articles": sorted.reverse()} ); }); }); }); }); } 我试图找出如何使这个更漂亮 – 你可以告诉我使用caolan的asynchronous库,但我不确定使用哪个控制stream结构。 看来,如果我使用async.waterfall,例如,会导致更多的代码,每个步骤都必须包装在一个匿名函数中。 例如,这只是瀑布的嵌套版本的前两行: function indexArticles(callback) { async.waterfall([ function(callback) { fs.readdir("posts/", function(err, files) { callback(err, files) }) }, […]

Asyncjs:绕过瀑布链中的函数

我想用asyncjs中的nodejs从一个瀑布函数链中跳过一个函数。 我的代码如下所示: async.waterfall([ function(next){ if(myBool){ next(null); }else{ // Bypass the 2nd function } }, // I want to bypass this method if myBool is false in the 1st function function(next){ }, // Always called function(next){ } ]); 你知道一个正确的方法做这个没有放: if(!myBool){ return next(); } 在我想绕过的function。 谢谢 !

node.js,setTimeoutcallback方法和“this”

我正在尝试使用node.js编写一个简单的轮询应用程序。 我想编写一个EventEmitter来执行一个计时器的行动,并根据该周期性行动的结果发出事件。 我开始创build我自己的对象,并从EventEmitterinheritance。 我启动一个计时器,使用setInterval,并指定定时器过后调用的方法。 在定时器callback方法中,我想引用我创build的对象的variables,但是this不会引用该对象。 我怎样才能在这个方法中引用我的variables? 这是我的代码: var util = require('util'), events = require('events'), timers = require('timers'), redis = require('redis'); // define worker object var JobPoller = function () { // inherit event emitter events.EventEmitter.call(this); // save reference to database this.db = redis.createClient(); // start main loop this.interval_id = timers.setTimeout(this.check, 1000); }; JobPoller.prototype.check = function […]