Articles of 承诺

Promise连接添加新的函数调用链

我试图加载和parsing一个文件,但是在调用两个函数时遇到了一些麻烦,并且返回了这个promise的结果。 我正在使用蓝鸟承诺。 以下代码按预期工作: run = function (filePath) { return Promise.join( fs.readFileAsync(filePath, 'utf8') .then(parseFile.parse.bind(null, 'userKey')), users.getUsersAsync(usersObj) .then(users.modifyRec.bind(null, process.env.users)) ).then(function (args) { return runProc('run', args[0], args[1]); …. 我已经将parseFile.parse函数分为两个方法, parseFile.parse和parseFile.getProp 。 parseFile.getProp应该从parseFile.parse获取输出,并返回在方法分解之前返回的parseFile.parse 。 这是我尝试使用这两个函数: run = function (filePath) { return Promise.join( fs.readFileAsync(filePath, 'utf8') .then(parseFile.parse.bind(null, 'userKey')) .then(parseFile.getProp.bind(null,'key')), users.getUsersAsync(usersObj) .then(users.modifyRec.bind(null, process.env.users)) ).then(function (args) { return runProc('run', args[0], args[1]); …. 但它不工作。 […]

在promisecallback中访问“this”的对象(然后)

我想用Javascript创build一个对象。 其中一种方法应该执行承诺链。 链中的每个方法都必须访问作为对象成员的configurationvariables。 问题是, this运算符在PromiseMethod2被改变,我无法访问configurationvariables(它在PromiseMethod1正常PromiseMethod1 )。 这是我的代码: var SomeObject(config) { var that = this; that.config = config; } SomeObject.prototype.SomeMethod = function() { var that = this; that.PromiseMethod1() .then(that.PromiseMethod2) .catch(console.error); } SomeObject.prototype.PromiseMethod1 = function() { var that = this; config = that.config; return SomePromise(); } SomeObject.prototype.PromiseMethod2 = function(someParams) { var that = this; config = that.config; […]

如何正确链接承诺与嵌套

我的节点项目目前包含一个嵌套callback的横向圣诞树,以获取数据并按正确的顺序处理它们。 现在我试图重构使用承诺,但我不确定如何正确地做到这一点。 比方说,我要提取一个办公室的名单,然后为每个办公室的所有员工,然后每个员工的工资。 最后,所有的实体(办公室,员工和工资)都应该连在一起并存储在一个数据库中。 一些说明我当前代码的伪代码(省略了error handling): fetch(officesEndpoint, function (data, response) { parse(data, function (err, offices) { offices.forEach(function (office) { save(office); fetch(employeesEndPoint, function (data, response) { parse(data, function (err, employees) { // link each employee to office save(office); save(employee); employees.forEach(function () { fetch(salaryEndpoint, function (data, response) { parse(data, function (err, salaries) { // link salary to […]

我怎样才能同步使用readline?

我只是试图等待用户input密码,然后使用它,然后继续我的代码的其余部分。 错误是Cannot read property 'then' of undefined 。 let rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('Password: ', password => { rl.close(); return decrypt(password); }).then(data =>{ console.log(data); }); function decrypt( password ) { return new Promise((resolve) => { //do stuff resolve(data); }); }

为什么我的迭代器再次进入?

我有以下程序 – 我使用genny.js来处理asynchronousstream量控制 – 我已经尝试与suspend.js相同 – 类似的错误。 我正在使用Stripe nodejs API。 我的迭代函数似乎被调用两次 – 这是造成一个错误 – 我不明白为什么被调用两次。 这一定是一个简单的思维把戏,我没有看到。 var genny = require('genny') genny.longStackSupport = true var stripe = require("stripe")("sk_live_….") fetchCharges = genny.fn(function* (d) { console.log("Before fetchCharges") var charges = yield fetchList(d()) console.log("After fetchCharges – found ", charges.length) return true }) fetchList = genny.fn(function* (done) { console.log("before fetchList") […]

蓝鸟承诺链:与结果“抓”

为了使这个问题对尽可能多的人有用,除了我在下面使用Node + Express的Bluebird承诺库之外,我将排除我的具体实现细节。 所以,假设我有下面的链( P返回一个promise, res是Express HTTP响应对象): P().then(function(){ // do nothing if all went well (for now) // we only care if there is an error }).catch(function(error){ res.status(500).send("An error occurred"); }).then(function(){ return P(); }).then(function(pVal1){ return [pVal1, P()]; }) // TODO: catch an error from P() here and log pVal1 .spread(function(pVal1, pVal2){ if(pVal1 === pVal2) { […]

承诺正在等待

我在我的nodejs应用程序中有一个类,下面的代码: var mongoose = require('mongoose'); var Roles = mongoose.model('roles'); var Promise = require("bluebird"); module.exports = Role; var err = null; var id; function Role(name, companyId) { this.err = err; this.name = name; this.companyId = companyId; this.id = getId(name, companyId); } var getId = function (name, companyId) { return new Promise(function(resolve, reject) { Roles.findOne({companyId:companyId, name:name}, function(err,result) […]

使用PDF承诺在Firebase云端函数中使用

我正在使用PDFMake(PDFKit的变体)使用实时数据库触发器在Firebase云端函数上生成PDF。 该函数从数据库获取所有相关数据,然后将其传递给应该生成PDF的函数。 所有这些都是使用Promises完成的。 一切正常,直到PDF实际生成的点。 以下是我的主事件侦听器中的代码: exports.handler = (admin, event, storage) => { const quotationData = event.data.val(); // We must return a Promise when performing async tasks inside Functions // Eg: Writing to realtime db const companyId = event.params.companyId; settings.getCompanyProfile(admin, companyId) .then((profile) => { return quotPdfHelper.generatePDF(fonts, profile, quotationData, storage); }) .then(() => { console.log('Generation Successful. Pass […]

在执行callback时,在Node.js中打破Q承诺?

请以承诺为理由,请原谅我的新手。 我在Node.js中使用Q模块 我有一个函数,一旦执行了所有必要的步骤,就会调用callback函数。 当我想从Q promise中调用callback函数时就会出现问题。 我希望的function是能够在达到最后一步时调用callback函数,而不再是承诺链中。 因此,callback将恢复到原来的操作状态。 但是,正如我编写的那样,callback在promise的上下文中被调用。 在这一点上,如果callback(比如说)抛出一个错误,它会被这个函数中的error handling程序捕获,这不是我想要的! var updateDataStream = function(data, input, posts, stream, callback) { // Pack all the items up… Q.ncall(data._packStream, data, posts, stream) // Upsert the cache into the database .then(function(){ return Q.ncall(data.upsert, data); }) // buffer the new input .then(function(res){ return Q.ncall(data.buffer, data, input); }) .then(function(final){ callback(null, final); […]

Async.js – ETIMEDOUT和callback已经被调用

当我运行index.js时,我不断收到ETIMEDOUT或ECONNRESET错误,后面跟着一个Callback was already called错误。 起初我以为是因为在调用onEachLimitItemcallbackonEachLimitItem之前我没有包含return 。 所以我将其包含在asynchronous多个callback文档中 。 仍然没有解决它。 我也尝试删除错误事件,并在错误事件中删除onEachLimit的callback,但都没有工作。 我已经看过围绕Callback already called的Callback already called问题的其他SO问题,但是由于他们不关心stream,我没有find解决scheme。 我的理解是,如果stream遇到像ECONNRESET这样的错误,它将返回错误事件中的callback,并继续到下一个stream,但似乎并不是这样。 几乎看起来,如果错误自行解决,即它重新连接,并尝试再次发送到Azure错误的蒸汽,它的工作,然后触发“完成”事件,我们得到了Callback already called的Callback already called 。 我是否正确处理stream事件中的callback? var Q = require('q'); var async = require('async'); var webshot = require('webshot'); var Readable = require('stream').Readable; var azure = require('azure-storage'); var blob = azure.createBlobService('123', '112244'); var container = 'awesome'; var countries = […]