Tag: 承诺

以小批次同时运行承诺(每次不超过X)

asynchronous库具有像eachLimit这样的function,可用于在多个CPU内核上高效地分发大量作业,如下所示: var numCPUs = require('os').cpus().length; var exec = require('child_process').exec; async.eachLimit(someArray, numCPUs, function (value, done) { exec('something –input' + value, done); }, finalCallback); 这样可以避免一次使用过多的命令来重载系统,但是仍然会利用多个CPU。 我想要做同样的事情,但有了诺言。 在Bluebird API中 ,我看不出有什么明显的方式来用Async这样一种简洁而富有performance力的方式来进行这种批处理。 Bluebird(或一般的Promise)有没有一个好的模式? 或者我可以使用的任何其他实用程序库?

在Javascript中通过一系列承诺传递状态的模式是什么?

我正在尝试学习一些关于Node和asynchronous编程的知识。 我阅读了有关Promises的信息,并试图在一个小型的项目中使用它们,这个小型的项目将服务A的用户从服务A复制到服务B.我很难理解如何在Promise之间传递状态 该项目是使用Promise库为NodeJS编写的 我目前的问题的一个简单的定义是: 如果post在服务B中不存在,则将用户的post从服务A复制到服务B. 这两种服务都提供了http API,它需要一个不可重复的用户标识来查找该用户的post,所以用户标识必须从用户名中查找。 所有的http调用都是asynchronous的。 这是一些伪代码,说明我如何将Promises链接在一起。 Promise.from('service_A_username') .then(getServiceAUserIdForUsername) .then(getServiceAPostsForUserId) .then(function(serviceAPosts) { // but what? store globally for access later? doSomethingWith(serviceAPosts); return Promise.from('service_B_username'); }) .then(getServiceBUserIdForUsername) .then(getServiceBPostsForUserId) .done(function(serviceBPosts) { // how do we interact with Service A posts? doSomethingThatInvolvesServiceAPostsWith(serviceBPosts); }); 有一些我曾经想过的事情: 在getPostsForUserId函数中引入getIdForUsername调用。 但是 ,我想按照“做一件事,做得好”的原则,尽可能简化每一个function单元。 创build一个“上下文”对象,并将其传递到整个链中,读取和存储此对象中的状态。 然而,这种方法使得每个function非常适合于一个链,因此很难单独使用。 有没有其他的select,build议使用什么方法?

Promise.all()没有解决时运行服务器 – 否则工作正常

我写了一个小工具,在调用其他许多承诺后返回一个承诺。 这个工具在单独testing时效果很好,下面的例子大概需要10秒。 但是,当我试着将它与一个http服务器实例一起运行的时候,如果根本按照几分钟的顺序返回的话! 我相当肯定,我只是误解了一些东西,因为我不是非常精通Node。 如果任何人都可以发现问题,或build议使用promise来处理asynchronous方法,请告诉我! 只是为了澄清,它是由挂起的traceRoute函数返回的Promise.all 。 子承诺全部按预期解决。 编辑:正如评论中所build议的,我也尝试了一个recursion的版本,没有调用Promise.all; 同样的问题。 这是一个正在运行的独立版本,没有运行任何http服务器实例: const dns = require('dns'); const ping = require('net-ping'); var traceRoute = (host, ttl, interval, duration) => { var session = ping.createSession({ ttl:ttl, timeout: 5000 }); var times = new Array(ttl); for (var i=0; i<ttl; i++){ times[i] = {'ttl': null, 'ipv4': null, 'hostnames': [], 'times': […]

如何在Node 4.x中使用Promise?

既然ES6在Node 4.x中是正式的标准,那么你如何使用Promise呢? 模块(例如本地fs模块)是否自动与Promises一起工作? 或者模块必须专门编写才能使用Promise? 你怎么知道你可以使用一个承诺,什么你不能? 有很多不同的Promise实现(Q,Bluebird等),我很困惑从Node 4.x中的本地Promise开始。

如何在SailsJS / Waterline中使用Model.query()和promise?

我遇到了Sails.JS 0.9.8的问题。 我想使用Model.query()函数(我使用sails-mysql适配器)承诺。 此代码将工作: User.findOne({ email: email }) .then(function(user) { console.log(user); }); 但是这个不会 User.query("SELECT email FROM user WHERE email = ?", [ email ])) .then(function(err, rows) { console.log(rows); }) 我得到了'err'和'rows'的undefined。 它只是没有实施,或者我做错了什么? 如果没有实现,是否有任何替代使用.query()承诺? 先谢谢你

用sinon和bluebird来保存一个promisifiedfunction

在我想testing的文件中,我有以下代码: var httpGet = Promise.promisify(require("request").get); httpGet(endpoint, { auth: {bearer: req.body.access_token}, json: true }) .then(…) 现在,在我的testing中,我想确保httpGet被调用一次,并确保参数是有效的。 在promisified之前,我的testing看起来是这样的: beforeEach(function () { request.get = sinon.stub() .yields(null, null, {error: "test error", error_description: "fake google error."}); }); afterEach(function () { expect(request.get).to.have.been.calledOnce(); var requestArgs = request.get.args[0]; var uri = requestArgs[0]; expect(uri).to.equal(endpoint); //… }); 不幸的是,当request.get被promisified时,这不再起作用。 我尝试刷新request.getAsync而不是(因为蓝鸟附加“asynchronous”promisifiedfunction),但是这也不起作用。 有任何想法吗?

蓝鸟承诺join行为

如果我用Node.js执行下面的代码 var Promise = require('bluebird'); Promise.join( function A() { console.log("A"); }, function B() { console.log("B"); } ).done( function done() { console.log("done");} ); 控制台将会logging B done 不过,我期望 A B done 要么 B A done 如果它在函数A中设置了一个断点,它永远不会到达。 为什么它处理B而不是A?

超时在asynchronous/等待

我与Node.js和TypeScript,我正在使用async/await 。 这是我的testing用例: async function doSomethingInSeries() { const res1 = await callApi(); const res2 = await persistInDB(res1); const res3 = await doHeavyComputation(res1); return 'simle'; } 我想为整体function设置一个超时时间。 即如果res1需要2秒, res2需要0.5秒, res3需要5秒我想有一个超时,3秒后,让我抛出一个错误。 使用正常的setTimeout调用是一个问题,因为范围已经丢失: async function doSomethingInSeries() { const timerId = setTimeout(function() { throw new Error('timeout'); }); const res1 = await callApi(); const res2 = await persistInDB(res1); const res3 […]

何时拒绝/解决承诺

我在想什么时候我需要拒绝承诺。 我发现了几个关于这个话题的问题,但是找不到合适的答案。 我应该什么时候拒绝承诺? 这篇文章http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises说: 解决:一个成功的Promise被“解决”,它调用正在等待的成功侦听器,并记住为未来成功侦听器parsing的值。 分辨率与返回的值相关。 拒绝:遇到错误情况时,Promise被拒绝,它调用正在等待的错误侦听器,并记住被连接的未来错误侦听器拒绝的值。 拒绝与抛出的exception相关。 这是原则指引吗? 那只有在发生exception时才拒绝承诺? 但是在遇到类似的function的情况下 findUserByEmail() 我会希望该函数返回一个用户,以便我可以继续链而不validation结果 findUserByEmail() .then(sendWelcomeBackEmail) .then(doSomeNiceStuff) .then(etc..) 什么是最好的/常见的做法?

在Node.js上,Q延迟是如此之慢?

所以我在Node.js中创build了这个简单的testing服务器 每当我做出直接的回应,我就会得到2200个请求/秒(快!)。 当我只包装一个简单的Q时,它会下降到580个请求/秒( 慢4倍 !)。 有人可以解释这个巨大的差异吗? // Requires var server = require('http'); var q = require('q'); // Start server var http = require('http'); http.createServer(function(request, response) { // Comment out either of two below sections // Without deferred // 2200 reqs/second response.writeHead(200, {"Content-Type": "text/html"}); response.write("test"); response.end(); // Q deferred // 580 reqs/second var deferred = q.defer(); […]