Articles of 承诺

等待解决多个callback

我试图从mongoose一次调用中获取ID。 之后,这些ID中的每一个都用来进行另一个返回多个对象的调用。 我正在尝试获取所有这些对象。 我目前的尝试看起来像这样: var members; var memberTimes = []; // Use the Group model to find a specific group Group.find({ members: { $elemMatch: { $eq: req.user._id } }, _id: req.params.group_id }, function(err, group) { if (err) { res.send(err); } else if (!group) { //res.send(new Error("User not in group or it does not exist")); } […]

从多个asynchronousfunction(承诺)收集数据

鉴于您必须从多个asynchronous函数或承诺获取数据的情况,收集和保存数据的最佳方法是什么? 一个示例情况是多个数据库查询需要在单个页面中呈现。 我遇到了下面的代码,这对我来说看起来像一个固定的模式,但是对于asynchronous游戏来说,新的东西是不确定的。 function complexQuery(objectId) { var results = {}; return firstQuery.get(objectId).then(function (result1) { results.result1 = result1; return secondQuery.find(); }) .then(function (result2) { results.result2 = result2; return thirdQuery.find(); }) .then(function (result3) { results.result3 = result3; return results; }); } complexQuery(objectId) .then(function (results) { //can use results.result1, results.result2, results.result3 res.render('dash', results); //example use }); 处理这种情况的最好办法是什么? 编辑澄清:必须在一系列,查询可能需要从前面的承诺结果的信息。

在node.js中使用q的空承诺

我尝试使用节点js来实现状态机。 简化我使用q和promise的callback。 在某些情况下,调用特定状态的函数什么也不做。 但要在控制stream程中使用它,我需要一个解决的承诺。 所以我的状态是这样的。 // onstate.js module.exports = function(){ this.switchOn = function(){ var deferred = Q.defer(); deferred.resolve(); return deferred.promise; }; this.switchOff = function(){ var deferred = Q.defer(); object.switchOff() .then(function(result){ // changing to off-state deferred.resolve(); }, function(err){ deferred.reject(err); }); return deferred.promise; }; } closuresfunction类似于Q实例中所述。 但是switchon函数呢? 我魔杖打电话给: currentState.switchOn().then(foo(), bar()); 我是否真的必须立即创build延期解决scheme,还是可以使用更简单的代码实现相同的行为?

为什么没有承诺的testing通过?

前几天我进入了一个美好的诺言世界,我只是觉得我已经开悟了。 承诺看起来很简单,但他们可以混淆。 你能告诉我为什么下面的testing不通过? var Promise = require('bluebird'); var expect = require('chai').expect; var request = Promise.promisifyAll(require('request')); describe('Promise', function() { it('should work again', function() { var final_result; function first_promise() { return new Promise(function(resolve, reject) { resolve("http://www.google.com"); }) } function second_promise() { return new Promise(function(resolve, reject) { resolve("This is second promise!"); }) } function inner_async_request(url_from_first_promise) { return new […]

蓝鸟:等待一个承诺解决

冒着听起来很愚蠢的风险:等待一个承诺解决的最有效的方法是什么? 说我有承诺A,我想创造承诺B,B的实现不取决于A的最终价值。即使A被拒绝,它也应该继续。 然而,这个过程不应该开始,直到A以某种方式解决。 我目前看起来如下所示: var prevResult; function doStuff() { if (prevResult) { prevResult = promise.settle([ prevResult ]).then(function() { return doStuff(); }) } else { prevResult = updateDB().finally(function() { prevResult = null; }); } return prevResult; } 代码有点不明显。 我也有点担心把一堆来自sett()的承诺链接在一起,看看它是如何执行不那么简单的协调的function。 似乎应该是一个更简单的方法来做到这一点。

承诺防止节点进程退出

我写了一个使用Bluebird promise来迁移数据的工具,以便用户可以通过node命令直接触发这个工具。 例: 节点migrate.js 问题是,这个节点进程完成后不会存在。 这里是主migrate.js的内容,exec()函数返回一个promise。 var migrate = require('../elasticsearch/migrate'); var setting = require('../../config/setting'); var cmd = new migrate(setting.NewConfig.search, true); cmd.exec() .then(function () { console.info('Operation completed'); }) .catch(function (err) { console.error(err); }); 目前,我强制退出通过调用process.exit(0); migrate.js的内容,我无法公开的一些代码,所以我将它们删除 'use strict'; var Promise = require('bluebird'); var request = Promise.promisifyAll(require('request')); var _ = require('lodash'); var index = require('./mapping.json'); var Schema = […]

在承诺链中有if-else条件

我有一个承诺链,并在一些点我有if-else条件如下: .then(function() { if(isTrue) { // do something returning a promise } else { // do nothing – just return return; } }) .then(function() { … }) 老实说,我不喜欢这种模式。 我感觉错了。 我的意思是使用一个简单的回报没有任何东西 你有什么想法让这个代码看起来不一样吗?

使用节点(ES6)和蓝鸟保证混淆

在asynchronous调用完成之前,我有一个值被分配的问题,所以我select使用Promises(在这个例子中是Bluebird)。 我认为可以解决这个问题,但是由于我并不十分熟悉承诺/节点,所以它仍然在做同样的事情。 我将如何去修改我的代码,以正确使用承诺? 并保持一个stream程,所以我可以validation基于前row modules ? var Promise = require('bluebird'); var db = require('../shared/db'); var queryHelper = require('../shared/queryHelper'); var schemas = require('../schemas/schemas'); var _ = require('lodash'); var serverSettings = require('../shared/coreServerSettings'); // Create new instance of mysql module var connection = new db(); var queryhelper = new queryHelper(); // Promised methods var queryAndWait = Promise.promisify(connection.query); ..snip […]

摩卡testing超时使用承诺和跳过代码,为什么?

我一直试图连续运行这个testing2天,我无法弄清楚它有什么问题: /*eslint-env mocha */ // var expect = require('chai').expect; var chai = require('chai'); var chaiAsPromised = require("chai-as-promised"); var expect = chai.expect; var Promise = require('bluebird'); var Archive = require('../lib/archive'); var path = require('path'); var fs = Promise.promisifyAll(require('fs-extra')); var globAsync = Promise.promisify(require('glob')); var tar = require('tar-fs'); var zlib = Promise.promisifyAll(require('zlib')); chai.use(chaiAsPromised); describe('Archive', function() { var pkg; […]

节点承诺循环

这是我的问题: 我正在向我的数据库中的一个表发出请求,结果那个请求我想向另一个表发出两个请求,这两个请求的结果想要将它们添加到主请求(第一个)。 问题是,这两个请求实际上是做出来的,但是当试图把结果放在主要结果中的时候不会让我。 第二个然后也运行时,第一个没有结束(第一个循环结束应该结束) 也许错误是非常愚蠢的,我是有承诺的新手。 谢谢 提取代码: var express = require("express"); var app = express(); var Promise = require('bluebird'); var bodyParser = require('body-parser') var mysql = require('promise-mysql'); app.get('/misPartidos', function (req, res) { var query = conexion.query('SELECT partidos.id_partido, partidos.id_torneo, partidos.nlocal, partidos.nvisitante, partidos.idlocal,partidos.idvisitante, partidos.jornada, partidos.glocal, partidos.gvisitante, partidos.fecha, torneos.nombre_torneo, partidos.estado, torneos.version, torneos.modo, torneos.tipo FROM partidos INNER JOIN equipos […]