Articles of 承诺

在NodeJS中用q.all命名承诺结果

我有点新东西,我发现它非常棒,但有些东西我仍然无法弄清楚。 我设法通过传递q.all一个q.all数组来运行一些联合的promise。 像这样的东西 var promises = [promiseOne(), promiseTwo()]; q.all(promises).then(function (results) { res.send(results); } ); 事情是这样的,我真的希望这些承诺被命名,所以我不必依靠承诺的顺序。 我读了一个地方,你实际上可以传递一个对象到q.all ,以得到命名的结果。 所以这将是这样的: var promises = { promiseOne: promiseOne(), promiseTwo: promiseTwo() } q.all(promises).then(function(results){ res.send(results); }); 但我想这只是不像发送数组一样,因为我没有得到我的承诺的结果在那里。 我得到的结果类似于这个: { promiseOne: { source: {} }, promiseTwo: { source: {} } } 那么你怎样才能从q.all得到命名结果呢? 有一件事要注意的是,我将在promises数组中promises数量并不是固定的,因为我通过从用户发送到我的函数的GET参数得到了这个数字。 此外,在我的每一个承诺,我有承诺的另一个数组(或对象)被parsing,其结果我也想命名。

请求承诺的顺序请求

有没有一个嵌套的方式来实现以下request-promise : r = require('request-promise'); r(url1).then(function(resp1) { // Process resp 1 r(url2 + 'some data from resp1').then(function(resp2) { // Process resp 2 // ….. }); }); 每个请求都取决于最后的结果,所以它们需要是顺序的。 然而,我的一些逻辑需要多达五个连续的请求,并导致相当嵌套的噩梦。 我是否在谈论这个错误?

我怎样才能节制堆栈的API请求?

我有一个id数组,我想为每个id做一个api请求,但是我想控制每秒有多less个请求,或者更好的是,在任何时候只有5个打开的连接,并且当一个连接是完成,取下一个。 目前我有这个,它只是在同一时间发射所有的请求: _.each([1,2,3,4,5,6,7,8,9,10], function(issueId) { github.fetchIssue(repo.namespace, repo.id, issueId, filters) .then(function(response) { console.log('Writing: ' + issueId); writeIssueToDisk(fetchIssueCallback(response)); }); });

节点redis promisification使用蓝鸟

我试图使用node-redis包的承诺,但我不能使用on.connect()方法。 var redis = require("redis"); var client = redis.createClient(); bluebird.promisifyAll(redis.RedisClient.prototype); bluebird.promisifyAll(redis.Multi.prototype); // callback version app.get('/redis', function(req, res) { client.set("foo_rand000000000000", "some fantastic value", function(err, reply) { if (err) { console.log(err); } else { console.log(reply); } res.end(); }); }); // promisified version app.get('/redis', function(req, res) { return client.setAsync("foo_rand000000000000", "some fantastic value").then(function(return) { console.log(return); // returns OK client.quit(); […]

这个代码中传播函数的目的是什么?

我想弄清楚如何使用mysql-promise。 https://www.npmjs.com/package/mysql-promise 这里是一些示例代码; var db = require('mysql-promise')(); db.configure({ "host": "localhost", "user": "foo", "password": "bar", "database": "db" }); db.query('UPDATE foo SET key = ?', ['value']).then(function () { return db.query('SELECT * FROM foo'); }).spread(function (rows) { //what's purpose of spread()? console.log('Loook at all the foo', rows); }); 传播函数的目的是什么? 它究竟做了什么?

在NodeJS,JXcore等下可能运行的代码如何检测它是否在支持本机ES6承诺的环境中运行?

例如,我有当前版本的官方Joyent NodeJS,当然还有Google V8 JavaScript引擎,还有带有Mozilla SpiderMonkey JavaScript引擎的JXcore。 前者似乎来源于原生的诺言支持,后者似乎不是。 (当然,这些并不是nodeJS代码可能运行的唯一两种可能的环境。 我的代码如何testing它的环境以查看它是否可以使用本机Promise? 在这种情况下,如果它检测到一个合适的polyfill是“本地的”就可以了。 但是它不应该检测出像Q这样的本地承诺。 (或者让我知道,如果我错了这个。)

Promise.all当它从.then()callback返回时不工作

我正在使用Promise Node.js库,我想要做到以下几点: 执行返回Promise的asynchronous操作。 当该操作完成时,返回两个并行asynchronous操作完成时完成的Promise。 我使用的代码如下: var Promise = require('promise'); var resolved1 = Promise.resolve(1); var resolvedAll = resolved1.then(function() { return Promise.all(Promise.resolve(2), Promise.resolve(3)); }); var print = resolvedAll.then(function(values) { console.log(values); }); print.done(function () { console.log('done'); }); 但是,这个代码不能按预期工作,因为它打印: [] done 从docu中,Promise.all返回一个promise,当迭代参数中的所有promise都解决了的时候,这个promise就会被parsing。 所以在理论上解决所有的承诺应该完成,直到所有的承诺传递给承诺, Promise.all已经完成,但这不是在这里发生的事情。 任何想法为什么Promise.all不按预期工作? 这可能是一个错误? 任何人都知道的替代scheme返回一个.then()callback多重承诺? 欢呼声,高尔德

ExpressJS / NodeJS / Promises:从承诺链早期返回

当我在服务器上发布一个请求来创build一个新的游戏时,我会执行一些查询。 首先,我search用户是否已经在游戏中,如果是,则返回游戏。 否则,我search一个开放的游戏,在这个游戏中有人正在等待对手,如果是这样的话,就返回那个游戏。 最后,如果没有发现上述状态的游戏,我创build一个新游戏并返回。 所以我的代码看起来像这样: .post( function(req, res, next){ …findUsersExistingGame… .then(function(game){ if(game){ return res.send(game); } else{ return …findUserWaitingForOpponentsGame… } } .then(function(game){ if(game){ return res.send(game); } else{ return …createNewGame… } }) .then(function(game){ return res.send(game); }) .catch(function(err){ return next(err); }); 我最终将每个函数重构为辅助函数,以提高可读性,但是我需要首先确定链接。 我的问题是,如果我在承诺链中早期发现一个游戏(即,有一个用户的现有游戏或另一个正在等待对手的用户),则返回res.send(游戏)。 然而,第三个.then会抛出一个错误,因为我以前的.then()语句返回undefined。 如果我想做一个res.send(游戏),我如何早日退出承诺链? 选项1:我已经看到了一些build议来抛出一个错误,并明确地捕捉错误,但是这种感觉从根本上是错误的,使用错误来控制stream量。 scheme2:我可以做这样的事情,而不是链接承诺,但是类似于“promise / callback hell”: .post( function(req, res, next){ …findUsersExistingGame… .then(function(game){ if(game){ return […]

Node.js:在parsing()被调用之前parsingPromise?

我对Node.js及其asynchronous行为很陌生。 我试图拿一个文件,保存它的副本,追加一行到复制的文件,并开始使用复制的文件 – 按顺序。 这大概是我现在所拥有的… var first = new Promise(function(resolve, reject) { console.log("1"); var readStream = fs.createReadStream("file.txt"); var writeStream = fs.createWriteStream("file-copy.txt"); readStream.on("end", function () { writeStream.end(); }); var pipeAction = readStream.pipe(writeStream); pipeAction.on("close", function() { console.log("2"); resolve(); }); }); var second = new Promise(function(resolve, reject) { console.log("3"); fs.appendFile("file-copy.txt", "\nA NEW LINE TO INSERT", function (err) { […]

在Promise返回函数中find第一个成功

给定一些function,返回承诺: function foo(arg) { return new Promise(function(resolve, reject) { if (stuff(arg)) { resolve('result from foo'); } else { resolve(null); } }); ); // … maybe more of these functions … function bar(arg) { return new Promise(function(resolve, reject) { if (otherStuff(arg)) { resolve('result from bar'); } else { resolve(null); } }); ); 我们怎样才能以串行方式迭代函数,在第一个函数返回一个非空值之后短路呢? [ foo, // […]