Articles of 承诺

对象方法与ES6 /蓝鸟承诺

我使用harmony标志在Windows上使用节点v0.11.14-nightly-20140819-pre 。 我有JavaScript对象,在其原型中定义了两个方法: function User (args) { this.service= new Service(args); } User.prototype.method2 = function (response) { console.log(this); // <= UNDEFINED!!!! }; User.prototype.method1 = function () { …………. this.service.serviceMethod(args) .then(this.method2) .catch(onRejected); }; function onRejected(val) { console.log(val); } Service对象的serviceMethod返回一个promise。 当我使用如下的User对象: let user = new User(args); user.method1(); this在对象的方法2中User一旦被调用一旦被调用then结束了undefined 。 我试过使用ES6和蓝鸟承诺实施。 为什么最终在这种情况下undefined ?

蓝鸟诺言串行迭代,并解决修改数组?

我有这个承诺,创build一个新的Item文件,如果没有在数据库中find,然后将其存储在以前创build的Collection文档.. Collection文档是数组中的第一个string,数组中的任何后续索引都将转换为一个或多个Item文档。 Promise.each “解决原始数组未经修改” ,所以Promise.each的最后一个return是呈现对象,但后来。然后生成原始数组.. 这是诺言(缩写为可读性): globalVar = true; collectionId = ""; var itemSeries = Promise.each(items, function(element) { if (globalVar == true) { return Models.Collection.findOneAsync({ "name": element }) .then(function(collection) { // promise chain similar to the following else.. // set the collectionId var to an _id }); } else { return Models.Items.findOneAsync({ "name": element }) […]

我应该在Promise中使用return吗?

function saveToTheDb(value) { return new Promise(function(resolve, reject) { db.values.insert(value, function(err, user) { // remember error first 😉 if (err) { return reject(err); // don't forget to return here } resolve(user); }) } } 这里是我从这里看到的代码。 我很困惑关于return关键字。 为了resolve(user); 我需要return吗? reject(user); 我需要return吗?

使用按键在node.js中启动操作

我正在使用node.js v4.5 我写了下面的函数来延迟发送重复的消息。 function send_messages() { Promise.resolve() .then(() => send_msg() ) .then(() => Delay(1000) ) .then(() => send_msg() ) .then(() => Delay(1000)) .then(() => send_msg() ) ; } function Delay(duration) { return new Promise((resolve) => { setTimeout(() => resolve(), duration); }); } 而不是延迟,我想激活使用按键发送消息。 类似下面的function。 function send_messages_keystroke() { Promise.resolve() .then(() => send_msg() ) .then(() => keyPress('ctrl-b') […]

以小批次同时运行承诺(每次不超过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),但是这也不起作用。 有任何想法吗?