Tag: promise

NodeJS:需要习惯用法:读取目录中的文件,连接,转换,写入

我正在尝试在Node中编写一个内容manglement程序。 我是一个老的Ruby / Perl / Shell多年的手,我似乎无法得到在这些语言中工作的简单代码在Node中看起来类似,简单。 任务 :find所有的*.md文件,读取它们(按ls顺序),转换它们,用括号注释和页脚注释括起来。 这些文件按顺序有一个Markdown,在汇编和转换时,是一个合理的HTML文档。 这是一个shell实现: echo '<!– Generate at:' $(date) ' –>' $(ls *.md |xargs cat|markdown)'<!– Copyright Mumble-demo Inc. –>' 生成所需的HTML: <!– Generate at: Tue Jun 6 08:25:59 EDT 2017 –> <h1>This is a Markdown File</h1> <h2>Heading 1</h2> <p>Inside of markdown we can create many interesting items</p> <ul> <li>such</li> <li>as</li> […]

如何防止在node.js中两次调用相同的URL

我有数量的电话作为后端。 其中一些是相同的URL。 我正在caching结果。 但我的问题是,如果我立即用同一个URL调用loadCached两次(或几次),它实际上也会调用两次提取,因为在第一次提取被parsing之前,caching没有url。 所以,只有当一个抓取成功完成(=已解决)时,caching才起作用。 我怎样才能改进代码,等待第一次parsing,以避免重复查询? function loadCached(url) { let cache = loadCached.cache || (loadCached.cache = new Map()); if (cache.has(url)) { return Promise.resolve(cache.get(url)); // (*) } return fetch(url) .then(response => response.text()) .then(text => { cache[url] = text; return text; }); } 我正在使用promise.all()等待loadCached来解决。

无法通过recursion调用node.js中的函数从promiese获得响应

使用node.js Q承诺库我怀疑这是recursion调用一个函数是有用的。 我已经尝试了两种方法来解决我的问题。第一种方法,我试图直接从recursion函数返回而在第二种方法,我试着用Q诺库。 这里是我从那里调用recursion函数的代码,并期待在这里的响应。 function getSearchedUserInTree(userId,body){ var deferred = Q.defer(); var loggedInUserId = userId; var searchUserIdSql = "SELECT rc.user_id,CAST(b.node_id AS CHAR) AS node_id FROM refer_codes AS rc LEFT JOIN btrees AS b ON b.user_id=rc.user_id WHERE rc.refer_code='"+body.refer_code+"'"; connection.query(searchUserIdSql, function (err, result,field) { var getLoggedInNode = "SELECT CAST(b.node_id AS CHAR) AS node_id FROM btrees as b WHERE […]

在以后的链条中使用第一个承诺的价值

我很想知道如何在Q promise中实现“链接”之间的共享价值,而不会完全亵渎承诺的美丽成语。 我使用Q在mongo数据库上做一些逻辑。 我的GET端点逻辑看起来不错: return Q.ninvoke(this.db, 'collection', 'namespace') .then(function(namespaceCollection){ return Q.ninvoke(namespaceCollection,'findOne',{"name":name}) }).then(function(queryResults){ if(!queryResults){ throw new providerErrors.NotFound(); return } return queryResults; },function(err){ throw new providerErrors.BadRequest(); });; 然而,将相同的模式应用于我的插入端点时,我遇到了一个问题。 我必须使用从第一个承诺返回的集合,即从db对象获取集合的集合,以便将值保存下来: return Q.ninvoke(this.db,'collection','namespace') .then(function(namespaceCollection){ return Q.ninvoke(namespaceCollection,findOne,{"name":namespace.name}); }) .then(function(foundNamespace){ if(namespace){ throw new providerErrors.Conflict(); return } //This is a new namespace object, give it a datetime and then //let's save it! […]

嵌套与q-io承诺

我试图理解那个承诺,回报另一个承诺成为回报价值的想法。 这就是我在wiki上的Q文档中阅读的内容。 https://github.com/kriskowal/q#tutorial 这是理想的情况,因为我使用q-io / http使用promise来发出请求。 然而,该函数返回一个新的承诺身体的价值。 而不是将我的代码的其余部分embedded到我的第一个函数中。 我希望在嵌套承诺完成时得到通知。 但是,由于范围,我似乎无法做到这一点。 但是我一直在读,我的外在function应该成为内在承诺的价值。 我错过了什么吗? 防爆。 module.exports = function (obj) { var getFiles = HTTP.request(obj); getFiles .then(function(res) { return res.body.read() }); return getFiles; }; 我希望在res.body.read()使用Q.all()实现其承诺时得到通知,但我不知道如何获得该值。 我觉得getFiles应该成为内心的承诺。 对?

如何将对象数组映射到Q promise的数组中

我似乎无法理解这一点。 我有一个职位清单,我想把它变成一系列的承诺,然后我想收集。 它不工作,positionPromises结果为空数组(例如[null,null]) var positionPromises = _.map(positions, function(position) { var newPosition = Position({ 'weight': 1 ,'ideaId': idea.id }) var promise = null Q.all([ // asynchronous sets (each does a db lookup) newPosition.setDirectionByName(position.direction) , newPosition.setSecurityByTicker(position.ticker) ]).then(function(noop) { // the position has it's data, invoke save which also returns a promise promise = Position.qCreate(newPosition) }).done() return promise […]

是否可以在Q.All中一次性返回所有“失败”

基本上,我有一大堆我想testing网站的对象。 我正在使用下划线将URL转换为HTTP请求的承诺数组。 一旦失败,链条就结束了(我预料到了这一点)。 是否有可能收集所有失败并返回到失败function? 或者我将不得不写这个使用allSettled然后parsing? var Q = require('q') var _ = require('underscore') var JSON = require('JSON') var FS = require("q-io/fs"); var HTTP = require("q-io/http"); FS.read('members.json').then(function(memberJson){ return JSON.parse(memberJson) }).then(function(memberObjects){ var httpCheckPromises = _. chain(memberObjects). first(100). filter(function(member){ return member.website.toLowerCase().indexOf('www') >= 0 }). map(function(member){ return HTTP.read(member.website) }). value() return Q.all(httpCheckPromises) }).then(function(goodRequests){ console.log(goodRequests) }).fail(function(badRequests){ console.log('bad') console.log(badRequests) })

在下游的早期承诺中访问variables

本质上在下面的脚本中,我想知道什么URL被请求导致失败的状态。 我是否需要将其封装在一个对象中并继续传递给下游? var Q = require('q') var _ = require('underscore') var JSON = require('JSON') var FS = require("q-io/fs"); var HTTP = require("q-io/http"); FS.read('members.json').then(function(memberJson){ return JSON.parse(memberJson) }).then(function(memberObjects){ var httpCheckPromises = _.chain(memberObjects) .first(50) .filter(function(member){ return member.website.toLowerCase().indexOf('www') >= 0 }) .map(function(member){ return HTTP.read(member.website) }) .value() return Q.allSettled(httpCheckPromises) }).then(function(responses){ return _.chain(responses) .where({state:'rejected'}) .pluck('reason') .pluck('response') .value() ; }).then(function(badResponses){ return _.chain(badResponses) […]

在节点中使用promise来循环返回相同的响应

当使用q时,我得到相同的响应循环次数: function start() { var the_promises = []; var api_info = config.AFV var deferred = Q.defer(); var extPath = '/search/' var callType = 'GET' var mymd = buildmd5(api_info, extPath, callType); for(var page=1;page<4;page++) { console.log('getting page:'+page) new Client().get(url'+page, function(data, response){ deferred.resolve(data); }); the_promises.push(deferred.promise); } return Q.all(the_promises); } start().then(function (clips) { inspect(clips) }); 输出:resultPageNumber:['1'],resultPageNumber:['1'],resultPageNumber:['1'],resultPageNumber:['1'], 我觉得我可能有var deferred = […]

有点困惑q和nodejs承诺

我目前在nodejs中有几个js文件,它们是作为模块加载的,并且增加了app对象(使用express)。 所以他们的签名看起来像: module.exports = function(app, callback) { // … callback(); } 所以目前我有大约5个我的代码看起来像: require("./setup/a")(app, function() { require("./setup/b")(app, function(){ require("./setup/c")(app, function(){ require("./setup/d")(app, function(){ require("./setup/e")(app, function(){ startApp(); }) }) }) }) }); 现在,它看起来不好看,因为它的“厄运的金字塔”,但是我不完全确定如何改变这种模式来使用Q,因为我假设我会使用Q.fcall(…a).then(…b).etc.done() 。 然而,我不确定我是如何将应用程序传递给它的,如果我需要返回它的callback以作为承诺来处理。 理想情况下,我不想通过我的代码开始重新启动Q我只希望它在我想删除金字塔用例的地方,所以在上面的例子中,我如何使用Q来承诺将应用程序传递到每个需要的模块然后在最后启动应用程序?