Tag: 承诺

JS Promise waitFor刷新令牌

情况很简单: 我有一个nodejs服务器(称为API-A)使用蓝鸟作为承诺处理程序。 我有一个客户端(浏览器),通过从另一个API(API-B)获取数据的API-A询问数据。 API-B可以是来自示例的气象服务,然后API-A将数据与其他数据聚合并将其发送回客户端。 情况是下一个:API-B需要一个具有1800秒的TTL的令牌。 因此,对于客户端的每个请求,我检查我的令牌是否过期。 我有这样的代码: function getActivities() { return this.requestAuthorisation() .then(()=>{ // some other code that is not interesting }) } 一切工作都很好,承诺的荣耀。 requestAuthorisation()检查令牌是否有效(下一个!!!),如果没有(我做一个请求API-B刷新令牌)问题在于:在这个时间之间,令牌已经过期以及获得的时间一个新鲜的,有时会发生。 如果1000个客户端同时询问这些,我将有1000个令牌对API-B的请求,这不是很酷。 我怎样才能避免呢? 我尽量避免使用cron-way,避免不必要的调用,问题是一样的。 我尝试创build一个跟踪令牌刷新状态的全局variables(boolean),但不可能find一种Promise.WaitFor(variables更改)的Promise.all无法使用,因为我处于不同的事件范围。 有没有办法排队,直到令牌刷新? 请帮忙 !

如何在Node.js中对promise做recursion请求?

我需要从API读取数据,每个查询只得到100个结果,从哪里获得下一个100个时间戳。 我设法用下面的代码一个接一个的做多个请求,但由于某种原因,它永远不会回到最初的承诺。 它卡在“没有更多的订单取”。 app.get('/test', (req, res) => { const getOrders = (from) => { return request(mcfApiUrl + "changes?created_after_ts="+from+"&key="+mcfKey) .then(xml => convert.xmlDataToJSON(xml,{explicitArray:false,mergeAttrs:true})) .then(orders => checkForMore(orders)); } const checkForMore = (orders) => { return new Promise((resolve, reject) => { if (orders['Orders']['orders'] == 100){ getOrders(orders['Orders']['time_to']); console.log("Fetched "+ orders['Orders']['orders']+" orders"); console.log("More orders available from: "+moment(orders['Orders']['time_to']*1000).format()); } else { console.log("Fetched […]

为什么Mocha的`before()`函数传递是否带参数?

在我的describe有这样的代码: before(a) 。 当看起来像这样: function a() { return chai.request(app) … .then(res => { res.blah.should.blah; return Promise.resolve(); }); } …一切都很好(这是一个非常快的电话)。 但是,当我做ainputvariables: function a(dummy, my_var) { return chai.request(app) … // use my_var here .then(res => { res.blah.should.blah; console.log("finished!"); return Promise.resolve(); }); } 承诺永远不会解决。 两点意见: finished! 确实得到正确的输出(立即) dummy填充。 这是填充这个: function (err) { if (err instanceof Error || toString.call(err) […]

如何在forEach中调用promise?

我有事件stream向下面的程序,所以基于事件的价值我触发不同的承诺,所以我想检查是否它的好主意内使用承诺forEach。 用下面的代码,当我有事件element.variables.caseIdFound值永远不会满足条件。 任何想法什么是执行错误我是相当新的承诺。 任何与以下代码的例子高度赞赏。 camunda.js var caseIdFound; var processingCompleted; function checkTicketNum(element) { var EventCasesID; var event; var ticketNumber; var CasesID; var insertIDBEvents = []; var event; return new Promise(function(resolve, reject) { event = JSON.parse(element.variables.event.value); ticketNumber = event.body.raw.tkt; CasesID = event.body.raw.CasesIDuuid; controller.insertCase(ticketNumber, function(err, response) { event.body.raw.LogIDuuid = generateUUID(); if (response.length == 0) { completeTask('TicketNotFOund',element.id); } else […]

promis中的Nodejs事件不能解决

当我打电话pdfCreate ,一个事件被加载,工作正常。 然后createIncidentReport被包含的服务调用,这工作正常。 一旦将PDF写入磁盘,将调用pdfStream.on('finish') ,这可以在控制台上正常工作。 日志被写入,但是然后邮件服务不被调用。 我应该如何解决这个承诺? function pdfCreate(incidentId) { Incident.findById(incidentId) .then(incident => pdfService.createIncidentReport(incident)) .then(() => mailservice.sendPdfCreatedMail(incident)); } function createIncidentReport(incident, res) { return new Promise((resolve, reject) => { let pdfStream = fs.createWriteStream(settings.PDF.DIRECTORY + incident.id + '.pdf'); incidentReport.pipe(pdfStream); pdfStream.on('finish', function () { console.log('finished writing pdf') resolve(); }); } } function sendPdfCreatedMail(incident) { console.log('mail'); let message = […]

NodeJS / gm:承诺asynchronous调用

我使用gm来操作nodeJS应用程序中的一些图像。 这是我的function如何。 正如你所看到的,有一些操作开关(在这个例子中:旋转)。 gmStream被创build,在切换之后.stream()和pipe()将被使用。 到目前为止,一切都很好。 但是,对于切换resize的情况下,我需要知道图像的尺寸,我通过size() 。 但是这是一个asynchronous调用。 这个gmStream不用于交换机下面显示的stream() 。 但是在这个stream()会做更多的数据库的东西,所以我需要使用相同的东西… function manipulate (method, param) { return new Promise(function (resolve, reject) { // Configure GridFS (gridfs-stream) const gfs = Grid( MongoInternals.defaultRemoteCollectionDriver().mongo.db, MongoInternals.NpmModule ) switch (method) { case 'rotate': gmStream = gm(readStream) .rotate('#ffffff', param.rotate) break // … some more cases … case 'resize': gmStream = gm(readStream) […]

承诺中的exception处理

有时候构造一个承诺可能会有一个例外的情况,如数据库拒绝连接或数据库的无效主机名参数,例如: 在db.js中 const mysql = require('mysql'); module.exports.connect = (options) => { return new Promise((resolve, reject) => { try { const connection = mysql.createConnection(getDBConfig()); connection.connect(); resolve(connection); } catch (err) { throw new Error('Error connecting database'); } }); }; function getDBConfig() { const isProd = process.env.NODE_ENV === 'production'; const config = { debug: !isProd, host: 'localhost', user: […]

与承诺组合作

我很难理解如何与需要一起解决的承诺组合作。 在我的情况下,我想做一系列基于ID数组的promise调用,并select性地将它们添加到输出数组中。 如果这是PHP我会做这样的事情: $output = [] foreach($input as $id) { $result1 = functioncall1($id); $result2 = functioncall2($result1); if ($result2 == 'some filter') { $output[] = $result1; } } 这不能用asynchronous调用完成,因为循环不等待结果返回。 所以我使用蓝鸟这样的承诺: Promise.map(input, function(id) { promisifedFunction1(id) .then(function(result1) { //process result1 some more promisifedFunction2(result1) .then(function(result2) { //process result2 some more if (result2 == 'some filter') { return result1; }); […]

如何用async / await等待child_process.spawn的执行?

我有一个这样的函数,它接受一个命令,参数和一个进程: execPromise (command, args) { return new Promise((resolve, reject) => { const child = spawn(command, args) child.stdout.on('data', (data) => { this.logger.info(`stdout: ${data}`) }) child.stderr.on('data', (data) => { this.logger.info(`stderr: ${data}`) }) child.on('close', (code) => { if (code !== 0) this.logger.error(`Command execution failed with code: ${code}`) else this.logger.info(`Command execution completed with code: ${code}`) resolve() }) }) } […]

使用promise和rediscallback

我试图用我在Redis服务器上的东西填充我的var todos ,我得到我必须使用承诺,但我可能不在正确的位置。 首先,我用.smembers()函数获取所有ids,并且为每个id获取具有正确id的对象并将其parsing为todos 。 var todos=[]; res.locals.redis.smembers("todo:20", function(err, reply){ // ie SMEMBERS todo:20 returns 0 and 1 var promises=reply.map(function(elem){ res.locals.redis.get("todo:20:"+elem, function(err, reply1){ // ie GET todo:20:0 return new Promise(function(resolve, reject){ todos.push(JSON.parse(reply1)); resolve(); }); }); }); Promise.all(promises) .then(function(){ res.locals.redis.quit(); res.render('todolist.ejs', {todo: todos}); }) .catch(function(reason){ console.log(reason); }); });