Tag: 承诺

Axios获取请求超时被吞噬(Promise)

我一直在研究这个数据收集模块,这个模块应该是从不同的比特币市场获得数据,并将所有接收到的数据标准化,以便将其插入到mongodb数据库中供以后使用。 (该模块是在节点4.3.x中编写的) 我遇到的问题是我需要在数据库中表示数据的一致性。 所以,每当一个请求超时,而不是捕获获取请求并logging一个错误,我想parsing一个'0'。 此外,收到的数据包含需要按顺序切割的交易。 这需要发生,以便交易可以正确地切割,所以数据不会被写两次。 为此,我实施了两个队列: 1:TimestampQueue – 保存时间戳。 下一个预期的响应是[0]中的时间戳 2:objectQueue – 保存收到的响应 =>只要objectQueue [0]中的对象等于timestampQueue [0] =>中的时间戳,就执行数据操作并插入到数据库中。 问题在于,应该捕获超时的axios.get请求并不一致。 它发生在随机的时间框架之后,但平均而言,队列在2小时之后就会卡住了。 为了使这里更清楚一些重要的代码片段:httpclient使axios请求: get(url) { return this.instance.get(url) //instance just defined a timeout. Nothing special .then(response => { return response.data; }) .catch(error => { throw error; //THIS SEEMINGLY DOESN'T GET EXECUTED IN THE DESCRIBED CASE }); } 现在解决请求的市场处理者: […]

如何在快递4上发送承诺的收益作为stream?

我有什么办法可以把承诺作为一种传承的结果吗? 在某些情况下,JSON有效负载将是巨大的,将它作为一个stream发送是有道理的。 function aPromise() { // result of a postgres query. Using `pg` return Promise.resolve([ {key1: val1, key2: val2 } ]); }); } //express 4 router let wrap = require('co-express'); router.get('/', wrap(function* (req, res, next) { let payload; try { payload = yield aPromise(); } catch (e) { return next(e); } res.json(payload); }));

连续执行Promise.all

我有一个数组,其中包含承诺数组,每个内部数组可以有4k,2k或500个承诺。 总共有大约60K的承诺,我也可以用其他值来testing它。 现在我需要执行Promise.all(BigArray[0]) 。 一旦第一个内部数组完成,我需要执行下一个Promise.all(BigArray[1])等等。 如果我尝试执行一个Promise.all(BigArray)它的投掷: 致命错误call_and_retry_2分配失败 – 进程内存不足 我需要执行它的每个承诺串联,而不是并行,我认为这是什么节点它在做什么。 我不应该使用新的库,但是我愿意考虑答案! 编辑: 以下是一段代码示例: function getInfoForEveryInnerArgument(InnerArray) { const CPTPromises = _.map(InnerArray, (argument) => getDBInfo(argument)); return Promise.all(CPTPromises) .then((results) => { return doSomethingWithResults(results); }); } function mainFunction() { BigArray = [[argument1, argument2, argument3, argument4], [argument5, argument6, argument7, argument8], ….]; //the summ of all arguments is over 60k… const […]

nodejs + Q承诺:执行句柄中没有引用exception

我是nodejs的新手,试图编写第一个更大的项目。 不幸的是,当我在Q fullfilment句柄里面犯了一个错误时,我被nodejs退出了,没有错误。 例: var Q = require('q'); function test1() { var deferred = Q.defer(); deferred.resolve(); return(deferred.promise); } console.log("Start"); test1() .then (function(ret) { imnotexisting; //this should be shown as Reference Exception console.log("OK"); }, function(err) { console.log("FAIL"); }); console.log("Stop"); “ 输出将是: Start Stop 没有语法/参考或任何其他错误,因为“imnotexisting”部分。 在fullfilment句柄之外的同样的错误抛出erorr,因为它应该。 我在Ubuntu上使用nodejs 4.4.4。

在Node.js模块函数之间传递数据库上下文

我正在Node.js上运行Express,想知道如何在不同的Node模块之间有效地传递单个数据库连接上下文对象(想想它们就像应用程序模型一样)。 我想这样做是为了能够在一个模型中启动一个数据库事务,并在一个HTTP请求的持续时间内保持它对其他受影响模型的调用。 我已经看到有人试图在我的路由运行之前使用作为中间件暴露的每个请求数据库连接来解决这个问题(从连接池中获取数据,然后在路由之后运行另一个中间件以将连接返回到池)。 不幸的是,这意味着明确地将一个上下文对象传递给所有不受欢迎的函数,而这些函数不雅,笨拙。 我还看到有人在谈论延续本地存储和AsyncWrap模块,但我不清楚他们如何解决我的特定问题。 我试着用continuation-local-storage简单地工作,但是因为我主要在代码中使用promise和generator,所以它不能从run方法返回状态(它只是返回传递给它的callback的context对象)。 以下是我想要做的一个例子: // player-routes.js router.post('/items/upgrade', wrap(function *(req, res) { const result = yield playerItem.upgrade(req.body.itemId); res.json(); }); // player-item.js const playerItem = { upgrade: Promise.coroutine(function *(user, itemId) { return db.withTransaction(function *(conn) { yield db.queryAsync('UPDATE player_items SET level = level + 1 WHERE id = ?', [itemId]); yield player.update(user); return true; }); […]

在sequelize getter方法中的asynchronous表查询

我有一个执行数据库查询的sequelize实例方法: getPropertyDays() { const queryString = ` SELECT state FROM property_days WHERE DATE(day) = CURDATE() AND property_id = :propertyId;`; const replacements = {propertyId: this.id}; return this.sequelize.query(queryString, {replacements: replacements, type: sequelize.QueryTypes.SELECT}); }, 被getter调用: getterMethods: { propertyState() { var self = this; const blockedDay = 'x'; const unavailableDay = 'u'; this.getPropertyDays().then(function(result) { var state = result[0]['state']; if […]

Sequelize-创build一个instarnce后不返回承诺

我正在尝试创build新的filter并打印(console.log)刚刚创build的对象的id,但它不会进入.then函数。 代码如下: var Sequelize = require('sequelize'); var FilterModel = require('../models/filters'); var Filter = new FilterModel(Database, Sequelize); Filter.create({ name: data.filter_name }).then(function(filter) { console.log( '***************************************' ); }); 而'**'没有打印,但是input在DB中。 当我试图这样做: var filter = Filter.create({ name: data.filter_name }) 并打印“filter”我已经与created_at等新的实例,但ID为NULL。 该id定义为: id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }, 请有人可以帮助这里有什么问题吗? 谢谢!

在永久完成后运行一个刮板

我有这个刮刀,我希望永远运行,并在每次完成时运行它。 刮板会产生大量的http请求,并将数据写入文件。 当我尝试做这样的事情: while(true){ scraper(); } 出了些问题。 我的文件是空的 – 没有数据。 我认为它必须与一些asynchronous/事件问题有关,所以一个朋友build议我了解承诺。 所以现在我的刮刀看起来像这样: (function importData(){ return new Promise(function (resolve, reject) { var scraper = function(){ //Making thousands of http requests //manipulating and writing data //a little try and catch here and there } resolve(scraper); } }()) 我觉得上面的代码有很多错误。 我甚至不知道在哪里放弃reject 。 有一点需要注意的是我的http请求不是正常的http请求。 我正在使用这个 npm包,它以某种方式使得请求同步(在发出asynchronous请求时,我在写入数据时遇到了一些麻烦)。 也就是说,我正在寻找解决这个问题的办法(永远运行一个刮板/程序,并在完成之后才运行它)。 但学习如何兑现承诺是件好事。

knexjs承诺释放池连接

我目前使用knexjs.org ,承诺而不是常规callback,并使用池连接进行SQL查询。 第一次运行顺利。 但是现在我通常面临连接池的错误。 代码是这样的 knex('user_detail') .select('id','full_name','phone','email') .where('id', id_user) .then((result) => { resolve(result); }) .catch((error) => { reject(error); }) 但是现在我通常会得到错误连接超时和错误池连接。 为什么它得到一个错误的第一件事可能是因为我没有释放连接,但我有这样的代码, knex('user_detail') .select('id','full_name','phone','email') .where('id', id_user) .then((result) => { resolve(result); }) .catch((error) => { reject(error); }) .finally(() => { knex.destroy() }) 它适用于第一次尝试,但第二次尝试失败并出现错误There is no pool defined on the current client ,有时错误The pool is probably full 有人可以向我解释发生了什么事情,我怎么解决它? […]

如何使用蓝鸟承诺将parameter passing给护照策略callback?

我正在努力promisify passport.js的本地策略 。 我对诺言和护照都很陌生,而且我非常依赖这个评论线程 ,它使用蓝鸟的Promise库来传递额外的参数给passport的done()callback函数。 这个评论导致了一个新的蓝鸟实现处理额外的callback参数,但我不能让它在我自己的代码中工作: const passport = require('passport'); const User = require('../models/user'); const LocalStrategy = require('passport-local'); const NoMatchedUserError = require('../helpers/error_helper').NoMatchedUserError; const NotActivatedError = require('../helpers/error_helper').NotActivatedError; const localOptions = { usernameField: 'email' }; const localLogin = new LocalStrategy(localOptions, function(email, password, done) { let user; User.findOne({ email: email }).exec() .then((existingUser) => { if (!existingUser) { throw […]