Articles of 承诺

承诺解决子stream标准输出和拒绝子stream标准错误

我想build立一个使用require('child_process').spawn产生subprocess的承诺。 这个过程把它的输出输出到stdout ,把它的错误输出到stdout stderr 。 我希望承诺: 如果child.stderr发出任何数据,则reject(child.stderr stream (or its data)) 。 resolve(child.stdout stream)只有当没有错误发射。 我这样做是因为我想把承诺链接到: then处理child.stdoutstream(将stream上传到S3存储桶)。 一个可以处理child.stderrstream的catch ,允许我正确处理错误。 把这样的承诺和stream程结合起来是否可行? 我正在考虑在stderr上工作,但是不知道如何在stdout之间发生什么,如果有大量的数据进入它,我不处理它的速度不够快。

Node.js的exec事件不会在Promise内部触发

我有这个简单的代码,这是一个承诺,你可以看到: var exec = require('child_process').exec; return new Promise(function(resolve, reject) { var x = exec(`cd /maps && ls -la`, {}, function(err, stdout, stderr) { if (err || stderr) { reject(err + stderr); } resolve(stdout); }); x.stdout.on('data', function (data) { console.log(data); }); }); 事件从来没有被解雇,而如果我从一切工作中删除承诺 你有什么线索吗?

Javascript承诺.catch仍然调用最终variable.then

使用node , restify和bluebird promises ,睡眠剥夺的头脑: let chain = Promise.try(() => { return AsyncCall(auth_token).then(result => { if (!result) throw new Error('AUTH_TOKEN_ERROR'); } else { return facebook_data; } }); }).catch((error) => { res.code(401).error(error.message); next(); }); chain.then((result) => { // Gets called even though we throw the error. }); 我的问题是,我真的很喜欢chain.then() – “结束”承诺链(为了可读性)的方法,但即使.catch得到一个错误。 我意识到我可以设置最后的.then()到第一个链接块,但我想明白这一点。 我怎样才能保持相同的代码结构,但有一个.catch() – 事件结束承诺执行stream程?

在承诺链中等待DOM元素中的突变

我在Node.js中制作了一些网页抓取工具,用PhantomJS拍摄了一个网站上出现的地图。 但是,页面打开后,会在地图所在的位置显示加载消息。 地图准备就绪后,消息消失( visibility: hidden ),并显示地图。 正因为如此,我不能调用page.render()直到hidden #loader (或者我会得到一个加载消息的图片,而不是很酷)。 // … Open the page .then(function(content) { return page.evaluate(function() { // Wait for #loading to get hidden somehow … var clipRect = document.getElementById('map').getBoundingClientRect(); return { top: clipRect.top, left: clipRect.left, width: clipRect.width, height: clipRect.height }; }); }) // Render and process the picture … 我考虑使用突变观察者 ,但无法find使用它的方法,因为我处于承诺链中 ,并且事件侦听器不能按我的要求工作。 […]

如何从节点中的api promise返回对象

我试图理解承诺是如何工作的,而且显然错过了一些东西。 在节点中,我有一个使用Twit模块返回Twitter结果的search函数,然后我想用结果做一些事情: var twitter = require('../server/twit'); exports.getTwitSearchResult = function(query, cb) { var t = twitter.searchTwitter(query) // do something with variable 't' // var tweet = t.data.statuses // … // … cb(null, tweet); }; '../server/twit' twitter函数: var Twit = require('twit') var bot = new Twit(config); exports.searchTwitter = function(query){ var tsearch = function(query, callback){ return bot.get('search/tweets', { […]

蓝鸟承诺和域名

我有一个在蓝鸟承诺中抛出一个错误的问题。 采取以下代码: var Promise = require('bluebird'); var domain = require('domain'); var problem = function() { return new Promise(function(resolve, reject){ reject(new Error('Oops!')); }); }; domain.create() .on('error', function(e){ console.log("Caught Error " + e.message) process.exit(1); }) .run(function() { problem().done(); }); 我希望看到Caught Error Oops! 在控制台。 但是,似乎错误没有被捕获到域内,我在控制台中看到一个致命的错误和堆栈跟踪。 有谁知道为什么?

为什么我的代码首先打印“下载结束”,然后开始下载html页面?

function downloadAsync(url, name) { return new Promise(function(resolve, reject) { request(url, function(err, response, body) { if (err) { reject(err); } else { fs.writeFileSync(path.resolve(process.cwd(), 'downloaded_html', name), body); console.log('got ' + url); resolve(); } }) }) } var urls = ['url1', 'url2', 'url3'] var promises = urls.map(function(url, i) { var name = i + '.html' downloadAsync(url, name) }) […]

在.settle()(或等价的)中打破一系列的Promise

目前我们正在使用bluebird v2.9.8 ,无法升级到v3兼容(现在,但可能没有解决scheme)。 过去我们已经使用了.settle() ,但是我们遇到了一个users集合映射到promises ,我们需要确认一个特定的字段是否为true 。 如果只有一个false情况,那就没有必要继续了。 如果他们都是true ,那就意味着我们已经执行了所有的promises 。 Promise.settle()将执行所有,等到所有完成。 再一次,我们的目标是一旦我们得到一个false中断。 原来的代码额外的一块是调用额外的Promise以获得更多的信息从数据库。 所以,重写使用Promise.all() : var accessPromises = users.map(function (user) { return new Promise(function(resolve, reject) { if (user.userId == matchingUserId) { return resolve(true); } else if (user.type && user.type == matchingType) { return resolve(true); } else { // See if this user is one […]

在打字稿中,不能使promisifyAll Redis api与Bluebird

我无法使打字稿中的redis api promisifyAll。 import * as redis from 'redis'; import {RedisClient} from 'redis'; import * as Promise from 'bluebird'; Promise.promisifyAll(redis); const client: RedisClient = redis.createClient(CacheConfig); 我收到以下打字错误。

为什么节点等待一个单一的承诺,但不是一个承诺的数组?

考虑这个函数嘲笑查询数据库,并在2秒后通过Promise返回一些logging: function query() { var recs = [1,2,3]; return new Promise(r => setTimeout(() => r(recs), 2000)) } 如果我添加下面的语句: query().then(console.log); 并用节点运行脚本,暂停2秒,打印出logging,并按预期返回。 另一方面,如果我用一组完全相同的承诺来replace那行: Array(5).map(x => query().then(console.log)); 该脚本立即返回,并且什么都不打印。 为什么节点在退出之前等待单个promise返回,但是当有5个未解决的promise时,立即退出?