Tag: 承诺

承诺结合stream

我想逐行阅读大文件并将数据插入到数据库存储中。 我functon返回一个Promise内部创buildstream,并解决它时,事件stream.on('end')被调用,但它不是我真的想要,因为在stream.on('data')它产生Promise.map() ,并且我想确定在resolve()调用之前完成的所有插入操作。 在这种情况下我怎样才能产生正确的链条? var loadFromFile = (options) => new Promise(function (resolve, reject) { let stream = fs.createReadStream(options.filePath, { flags: 'r', }); stream.on('data', (chunk) => { /* process data chunk to string Array */ Promise.map(lines, (line) => { /* process and insert each line here */ }) .catch((err)=>{ reject(err); }); }); stream.on('end', () => { […]

为什么node.js生成器不能按预期工作?

给定以下两个代码片断,为什么事务对象在工作案例中可见,但在另一个案例中不可见? 工作案例: return db.transaction(function(transaction) { return co(function*() { // transaction is visible, do something with it -> works } } 不是工作案例: var c = co(function*() { // transaction is NOT visible -> does not work! }); return db.transaction(function(transaction) { return c; }); 是否有可能在第二种情况下使交易可见?

不要等待所有的承诺来解决

我需要并行获取数据,然后用Node.js同时计算它们。 所以我使用promise.all,但它performance奇怪。 当我第一次启动它时,计算时间更长,并且在第一个承诺解决之后就失败了,即使其他人成功了。 当我第二次启动它时,速度更快,因为所有数据都存储在数据库中,所以成功了。 我真的不明白。 这是我的代码: var Promise = require('promise'); /* The list of objects */ var ingrd_list = JSON.parse(req.body.ingrd_list); /* func.addFood is my function to apply on. It takes a callback parameter as last parameter */ var pAddFood = Promise.denodeify(func.addFood); var pArray = []; ingrd_list.forEach(function(ingrd){ var my_p = pAddFood(ingrd); pArray.push(my_p); }); Promise.all(pArray).then(function(){ console.log("success !"); […]

nodejs then()函数在promiseparsing之前执行

我有一个使Promise按预期工作的问题。 我需要做以下事情: 我从stdout中获取文件名,将它们分割成一行并复制它们。 当复制操作完成后,我想开始其他操作,这是我的问题。 我已经在Promise中创build了一个复制函数,万一出现错误,我立即拒绝它,如果没有错误,我在循环完成后解决它,但由于某种原因,在复制操作完成之前, var lines = stdout.split(/\r?\n/); copyUpdatedFiles(lines).then( function() { console.log('this one should be executed after copy operation'); } ); function copyUpdatedFiles(lines) { return new Promise(function(resolve, reject) { for (var i = 0; i < linesLength; i++) { fs.copy(lines[i], target, function(err) { if (err) { reject(); } }); } resolve(); }); } 请帮助,因为我明显失去了一些东西。

在MySQL上使用Promise进行并行插入查询失败

我写了一个在Node.js中并行运行插入查询的代码,我也使用Promise.js。 但代码失败并引发“重复主键”条目的例外。 代码如下, var Promise = require("promise"); var mySql = require("mysql"); var _ = require("underscore"); var connection = mySql.createConnection({ host : "localhost", user : "root", password : "rahul", database : "testDb" //schema }); connection.connect(); function insertDept(name){ return new Promise(fn); function fn(resolve,reject){ getMaxDept().then(function(rows){ var deptId = rows[0]["DeptId"]; deptId = (_.isNull(deptId) === true) ? 125 : deptId; […]

在一个承诺里面callback里面

我知道,stackoverflow充满了类似的问题,我读了很多。 从我得到的承诺中throw应该拒绝它,因为我可以在文档中阅读: 如果执行者抛出一个exception,它的值将被传递给拒绝parsing函数。 但即使阅读了许多关于承诺的post后,我仍然不明白我正在粘贴的代码片段以及为什么会发生这种情况。 function foo(a, b, cb) { setTimeout(() => { cb('Inner error *!?"$%&#@"'); }, 0); } const getThePromise = () => { return new Promise((resolve, reject) => { const cb = (err) => { /* >>> ************ */ throw err; // catch not called // reject(err); // catch called /* ************ <<< */ […]

nodejs如何在其他文件中使用promise输出并修改它,然后返回它的值

我的代码如下所示: this.xmlObjectRepositoryLoader = function (xmlPath){ var innerMap = {}; var elementName; var filePath = xmlPath+'.xml' var self = this return new Promise( function(resolve, reject){ console.log("In xmlObjectRepositoryLoader : "+filePath) self.readFilePromisified(filePath) .then(text => { var doc = domparser.parseFromString(text,"text/xml"); var elements = doc.getElementsByTagName("Element"); for(var i =0 ; i< elements.length;i++){ var elm = elements[i]; elementName = elm.getAttribute("name"); var params […]

处理promisses和服务器响应的正确方法

我正在尝试改进我在node.js / sail.js中的代码,并且正在与promisses中的服务器响应作斗争。 当你看第一个.then函数时,你可以看到该方法在forbidden access或false的情况下返回false 。 然后,在接下来的函数中,我必须检查返回types是否为=== false以跳过部分并避免发送两次http头。 这可以改善某些方面,跳过所有的下一个方法,如果失败的话? 我可以抛出一个exception进入最后一个.catch但必须有一个case之间切换所有可能的状态。 (即禁止,serverError甚至没有find) Notification.findOne({id: req.param('id')}) .then(function(notification) { if (!notification) { res.notFound(); return false; } if (notification.triggeredBy != req.session.user.id) { res.forbidden(); return false; } return notification; }) .then(function(notification) { if (notification === false) { return false; } return Notification.update(notification.id, actionUtil.parseValues(req)); }) .then(function(notification) { if (notification === false) { […]

链接function如诺言

我在一个更大的应用程序内部构build了一个小节点js数据报废function。 我不太喜欢Javascript的承诺,请原谅我的误解。 不知道我的标题真的构成了我的问题。 所以我有这个: const getAxiosUrls = function() { axios.get("http://localhost:3000/gatable") .then(function (response) { return urls = response.data.rows.map( ([x, y, z]) => y ) })} 和这个 : const getNbShares = function() { Promise.map(urls, requestPromise) .map((htmlOnePage, index) => { const $ = cheerio.load(htmlOnePage); const share = $('.nb-shares').html(); let shareTuple = {}; shareTuple[urls[index]] = share; return shareTuple; }) […]

装饰Javascript Promise.then,使参数函数获得额外的参数

我有以下使用ES6 Promise的代码: const ctx = {} Promise.resolve() .then(() => doSomethingWith(ctx)) .then((retValue) => doSomethingElseWith(retValue, ctx)) 我希望能够做到这样的事情: const ctx = {} using(ctx) .then((ctx) => doSomethingWith(ctx)) .then((retValue, ctx) => doSomethingElseWith(retValue, ctx)) 首先,我有这样的东西: function using(ctx) { const p = Promise.resolve() p.then = (fn) => withCtx(fn, ctx) return p } function withCtx (fn, ctx) { const p = new Promise((resolve) […]