Tag: callback

如何处理asynchronous函数和集合?

假设我们有一个函数foo(item, callback)和一个集合items 。 我想要做的就是用项目中的每一个items与执行foo返回的值来replace,就像Array.map()一样。 但问题来了: foo的结果是在callback中产生的,所以我没有在callback本身之外访问它(显然,我不能改变foo来满足我的需要)。 你可以尝试一个像 var results = []; items.map((function(el) { foo(el, function(result) {results.push(time)}); }); 但是当你的results收集“准备就绪”的时候你就无法知道了。 我完全无能为力 我该怎么办? 什么是模式? 编辑:我更感兴趣的香草JavaScript的方式来实现这个比工具/库,这是无论如何可以接受的答案。

将附加parameter passing给callback函数

我觉得我一定是错过了一些明显的东西,但我似乎无法find它。 在nodejs中如何传递额外的参数到一个callback函数? fs = require('fs'); for(var i = 0; i < 5; i++){ fs.readFile(filePath, function(err, data){ console.log(i); }); } 这样做,你通常会得到一堆写在屏幕上的4。 我明白为什么会这样。 它正在发生,因为这是“我”的价值,当它到达所有callback的代码的一部分。 这也不起作用: fs = require('fs'); for(var i = 0; i < 5; i++){ fs.readFile(filePath, callback(err, data, i)); } function callback(err, data, i){ console.log(i); } 因为“错误”和“数据”是不确定的。 我也明白为什么是这样。 这适用于'我',但然后我失去了我需要的错误和数据值。 fs = require('fs'); for(var i = 0; […]

callback地狱和嵌套承诺之间的区别

我最近开始使用NodeJS和MongoDB(使用Monk)。 这是当我遇到“回拨地狱”这个词。 在我的代码中,我正在做同样的事情。 举个例子 – DBCall(d1, function(e, docs){ if(docs.length!=0) DBCall(d2, function(e, docs1){ if(docs1.length!=0) DBCall(d3, function(e, docs2){ //doing something with docs,docs1,docs2 }) }) }) 这是当我开始阅读“承诺”,我碰到这篇文章 – https://strongloop.com/strongblog/promises-in-node-js-with-q-an-alternative-to-callbacks/ 由于我在第三个callback中需要docs和docs1,所以我使用了嵌套的promise。 DBCall(d1) .then(function(docs){ if(docs.length!=0) return DBCall(d2) .then(function(docs1){ if(docs1.length!=0) return DBCall(d3) .then(function(docs2){ //doing something with docs,docs1,docs2 }) }) }) 从上面的代码片段我有以下问题(/怀疑): 除了使代码更易读,承诺是否具有性能优势? 嵌套承诺和callback地狱看起来类似于我。 实际上有什么区别? 我对这个承诺的概念很陌生。 任何帮助表示赞赏。

在callback中调用node.js中的助手函数?

我是相当新的编程与node.js,我不知道为什么我得到这个错误。 该函数看起来设置正确,我不认为我有任何asynchronous问题B / C这些应该考虑我自己的地方(我认为)的自variables。 我也尝试没有这个,使用简单的变种consolePrint(…)无论如何,这是我的代码在下面,错误日志下面。 /* global __dirname */ var express = require('express'); var app = express(); var bodyParser = require('body-parser'); var self = this; //CALLING HELPER FUNCTION HERE var server = app.listen(8000, self.consolePrint(server)); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use('/public', express.static(__dirname + '/public')); app.get('/', function (req, res) { res.sendFile(__dirname + '/public/views/index.html'); }); //—————helper function(s)——————-// self.consolePrint […]

在nodejs的每个callback之后,我是否需要检查错误?

我正在按照节点JS第一个error handling约定。 callback是以callback(null, response) 。 收到callback响应后,是否每次都检查是否为空? 例: methodCB(function (error, response) { if (error) { //handle error //Do i have to check this every single time for a callback? //Are there design alternatives for this or is this just a node thing? } else { //process response } });

节点js原型对象'self'var不存储正确的callback上下文

我是经验丰富的开发人员,但新的Java脚本和nodejs,我很抱歉,如果这个问题已被回答“原样”,但即使我已经去了多个例子和stackoverflow的答案,我没有find一个简单的完整例子的原型类用正确的“自我”var范围和绑定(这)。 我试了两个,都出错了,我会感谢您的帮助。 我尝试把var self = this; 在我的函数声明的开始,但是运行时,它实际上并没有通过函数代码,当它被设置为原型,所以,'这'设置不正确。 /** * Module Dependencies */ var cheerio = require('cheerio'); var http = require('http'); /** * Export */ module.exports = SimplePageGetter; function SimplePageGetter(pageLink) { this._pageLink = pageLink; } SimplePageGetter.prototype.getPage = function () { var self = this; http.request(self._pageLink, self._resultsPageHttpGetCallback).end(); }; SimplePageGetter.prototype._resultsPageHttpGetCallback = function (response) { var pageBody = ''; […]

Nodejs Mongoose – 如何避免callback地狱?

在使用它一段时间后,我可能会对Mongoose做错了。 当你有太多的callback时,我发现很难阅读,例如: 我想find一个文件并更新它。 我需要先find它,然后update将在findOne的callback中。 var sam = new Character({ name: 'Sam', inventory: {}}); Character.findOne({ name: 'Sam' }, function(err, character) { console.log(character); // now I want to update it. character.update({… }, function(err, characterID) { // now I want to know the size of the document after the update. Character.findOne({ _id: characterID }, function(err, character) { // […]

为什么这个callback函数不会引起竞态条件?

我不明白为什么下面的代码不会导致潜在的竞争条件。 它看起来像count和totalBytes是可以通过多个callback函数访问的variables,我觉得totalBytes += stats.size和totalBytes += stats.size可能会导致竞争,因为你不能保证传递给fs.stat()的callback函数的fs.stat() (因为它是一个IO操作)。 var fs = require('fs'); var count = 0, totalBytes = 0; function calculateByteSize() { fs.readdir(".", function (err, filenames) { var i; count = filenames.length; for (i = 0; i < filenames.length; i++) { fs.stat("./" + filenames[i], function (err, stats) { totalBytes += stats.size; count–; if (count === 0) […]

在Node.js中callback

今天我正在testingnode.js中的callback函数 我的代码是 function callback_test(callback) { for(i=0;i<=10;i++){ callback(i); } } callback_test(function(result) { console.log(result); callback_test(function(result2){ console.log(result2); }); }); 输出是 0 0 1 2 3 4 5 6 7 8 9 10 结果应该是 0 0到9和 1 再次从0到9。 但是,第一个callback是不工作的所有循环。 这只是第一个循环。 为什么?

callback后代码的最佳做法

这是我想要做的。 我目前使用node.js,它允许你做的事情之一是: socket.on("sometopic", function() { // this is a callback } 现在让我们说我有10个不同的主题,每个主题都有一个相应的处理函数,我保留在我的“窗口”中,例如: windows.callbacks["topic_a"] = function() { // code for cb a } windows.callbacks["topic_b"] = function() { // code for cb b } windows.callbacks["topic_z"] = function() { // code for cb z } 还有一段代码我想在每个callback结束时执行。 一个简单的方法是用这个代码创build一个函数,并在每个callback结束时添加一个调用,但是这远远不够优雅。 任何人都可以提出一个更好的解决scheme? 有没有我不知道的最佳做法? 这种函数式编程对我来说是相当绿色的。