Articles of 承诺

nodeJS:Promise在循环结束之前执行,callback堆栈

我正在使用promise来创buildresult array Postman响应; 然而,在forEach循环完成之前, resolve()被调用,而resolve()在forEach循环之外。 我觉得这是由于callback堆栈function。 考虑到callback stack ,在forEach循环完成执行之后,如何执行resolve() ? (server.js): logServer.post('/log/asset/audit/', function(req,res){ console.log('— starting log/asset/audit'); logDB.collection('logs') .find({"transaction.assetName" : assetName, "transaction.assetOwner" : assetOwner}) .toArray( (err, result) => { let token = JSON.parse(JSON.stringify(self_jwt_body)); var JSONPromise = new Promise((resolve, reject) => { //initialization result.forEach(function(element, index, array) { console.log('- before request.post'); request.post({ url: `${dc_link}/audit`, //includes dc_IP, dc_port and […]

听stream言承诺

我一直在阅读有关Observables 。 有一件事我读到,就是它能够像stream一样听。 我试着用下面的代码。 const Rx = require('rxjs/Rx'); Promise = require('bluebird'); let i = 0; function calculate() { return new Promise((resolve, reject) => { setInterval(() => { console.log(++i); resolve(i); }, 5000); }) } let source = Rx.Observable.fromPromise(calculate()); source.subscribe( next => { console.log(next, ' next '); }, err => { console.error(err) }, () => { console.log('done!'); […]

如何对待羽毛球内的承诺?

我想在插入数据库之前validation数据。 Feathersjs的方式是通过使用钩子。 在插入一组权限之前,我必须考虑用户post提供的数据的完整性。 我的解决scheme是find与用户提供的数据相关的所有权限。 通过比较列表的长度,我可以certificate,如果数据是正确的。 钩子的代码贴在下面: const permissionModel = require('./../../models/user-group.model'); module.exports = function (options = {}) { return function usergroupBefore(hook) { function fnCreateGroup(data, params) { let inIds = []; // the code in this block is for populating the inIds array if (inIds.length === 0) { throw Error('You must provide the permission List'); } //now […]

Node.js使用Q :: Q.ninvoke链承诺

我试图缩小与我的node.js服务器有关的内存问题的潜在原因。 我一直感到有点不舒服的一部分代码是我使用Q的承诺。 以下是我的基本结构: var Q = require('q'); MyClass.prototype.doSomething = function(somedata, callback) { var res = [];// will contain the results of each function call Q.ninvoke(this, 'doSomethingElse', 'hello!') .then((function(result){ res.push(result); return Q.ninvoke(this.someobject, 'someFunction', somedata); }).bind(this)) .then((function(result){ res.push(result); callback(null, res);// Returns both result objects, in an array }).bind(this)) .fail(callback) .done(); } 这看起来合乎逻辑吗? 如果doSomethingElse函数也使用promise,该怎么办? 这里的一切都是正确的吗?

承诺的节点模式

我有一个节点问题。 我想调用一个数据访问对象,可能还有其他的内容,一旦完成渲染一个Jade模板 就像是 : provider1.getData(args, function(error, results) { /* do something with each result element */ for(int i = 0l i < results.length; i++) { provider2.getData(args, function(error, items) { store.push(items); }); } }); /* Here I want to ensure that the above operations are complete */ result.render( …. , { data:store }); 基本上,我想确保数据检索完成之前,我与数据呈现模板。 目前,渲染发生时,variables存储不会被填充。 我看过看起来很有希望的承诺。 […]

承诺抛出未处理的错误的解决

我有下面的代码,但是当parsing被调用时,它抛出: Possibly unhandled Error: undefined at Promise$_rejecter (c:\projects\Test\promiseftp\node_modules\bluebird\js\main\promise.js:602:58) at WriteStream.<anonymous> (c:\projects\Test\promiseftp\index.js:45:33) at WriteStream.EventEmitter.emit (events.js:117:20) at fs.js:1598:14 at Object.oncomplete (fs.js:107:15) 代码如下: var Client = require('ftp'); var path = require('path'); var fs = require('fs'); var Promise = require('bluebird'); var c = new Client(); var connectionProperties = { host: "myhost", user: "myuser", password: "mypwd" }; c.connect(connectionProperties); var downloadFiles […]

node.js + sequelize +顺序执行

在我的节点应用程序中,我必须执行2个查询1之后(即)我必须执行基于第一个查询结果的第二个查询。 我的代码: var levels; try { sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) { levels = results; }).failure(function(err) { if (err) { logger.error(err.stack); throw (err); } else { if (callback) { callback(err, null); } } }); } catch (err) { } if (level == 2) { query = "select *from […]

Q承诺不起作用,减lessfunction

我试图返回最早修改date的目录中的文件。 这种方法似乎在createFileDateMap函数中失败。 我想减less一个文件path的数组,并创build一个文件名和MODdate的对象。 getModDate函数是一个asynchronous的fs.lstat调用。 我似乎无法设置我的reducer的acc从.then()块内的值。 当值取决于asynchronous调用时,我不确定如何实现减less var _ = require('lodash'), fs = require('fs'), path = require('path'), Q = require('q'); function checkDir(dir) { // Check if given path is valid directory var deferred = Q.defer(); fs.lstat(dir, deferred.makeNodeResolver()); return deferred.promise.invoke('isDirectory'); } function getFiles(dir) { // Get all files within a directory var deferred = Q.defer(); fs.readdir(dir, deferred.makeNodeResolver()); […]

为什么这个嵌套的承诺,然后在承诺的方法之前执行?

我正在尝试使用promise来调用getLoginState,然后存储该值,以便稍后使用它。 我想知道为什么在下面的代码块,q.fcall(getLoginState)的.then里面getLoginState方法之前调用? var mysql = require('mysql'); var q = require('q'); var login = "tyler"; var connection = mysql.createConnection({ host : 'localhost', user: 'root', password: 'root', port: '3306', database: 'root' }); var gotLoginState; var state; connection.connect(function(err) { if(err != null){ console.log("connection err: "+err); } q.nfcall(connection.query.bind(connection),"SELECT id, password, salt, gender, banned, gm, pin, pic, characterslots, tos FROM […]

在arrays上推送相同的函数时调用asynchronous函数

我有这个代码: var queue = []; var allParserd = []; _.each(webs, function (web) { queue.push(function () { WebsitesUtils.parseWebsite(web, function (err, parsed) { allParserd.push(parsed); }); }); }); Promise.all(queue).then(function (data) { console.log(allParserd); }); 基本上我需要抓取我所有的网页,并确保在完成每个parsing之后给出结果。 函数parseWebsite返回正确的数据,但是这样不被调用, allParsed只返回一个空数组。 我相信我错过了一些事情,我已经开始使用诺言了,只是有些日子。 如果您需要更多信息,请告诉我。 Ps我想要所有的function同时启动; 我不想等待每一个回应。