Articles of 承诺

处理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) […]

在这个node.js函数中运行多个MySQL查询

我有这个node.js函数,它执行单个MySQL查询后返回一个Promise。 function deletePoint(PointObj, door_id) { return new Promise(function(resolve, reject) { try { var connection = jonMySQL.getMySQL_connection(); var mysql_query = '`DELETE FROM table1 WHERE user_id=? and door_id=?`'; var mysql_query_placeholder_arr = [PointObj.user_id, door_id]; connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows, fields) { if (err) { return reject(err); } else { resolve(rows); } }); } catch (err) { reject(err); } }); […]

承诺循环。 如何检测哪个承诺现在返回结果?

我认为这是一个普遍的问题,但具体情况是: 我使用猛犸模块将docx文件转换为html 。 该模块返回一个promise 。 我有一个文件数组,当我使用循环来创build每个文件的承诺,我需要知道什么样的承诺返回我的结果(知道什么文件被处理)。 for(var i=0;i<filesPaths.length;i++){ mammoth.convertToHtml( {path: filesPaths[i]} ) .then(function(result){ filesHtml.push(result.value); //here I need to know the value of filesPaths[i] }) }

为什么这个带有promise的简单nodejs程序永远运行?

我正在运行一个相当简单的nodejs程序,它从一个mssql数据库中取出一些行,用它们做一些事情,然后退出。 相反,它做它应该做的,但是然后永远运行。 我忘记了什么让程序完成? 还是只是我的期望,当所有的承诺已经履行的程序将退出是错误的,我需要手动终止? 'use strict'; var mssql = require('mssql'); var myssqlConfig = { user: '…', password: '…', server: '…', port: 1435, database: '…' }; mssql.connect(myssqlConfig).then(function() { new mssql.Request() .input('someRow', mssql.VarChar(), 'someValue') .query("SELECT * FROM tableName WHERE someColumn > @someValue") .then(function(recordset){ // do non-relevant stuff with the record set. }) .catch(function(err){ console.log('Error: '+err); }); }).catch(function(err) […]

你如何使用javascript promisestring中的.then函数中的参数调用函数?

我正在将使用node.js编写的AWS lambda函数转换为使用promise而不是callback函数。 我用处理程序代码将所有的函数包装在处理程序中。 我试图打破简单的function,所以我可以在处理程序代码中尽可能平坦的承诺链。 我卡在一个点,我有一个.then(),返回一个值,我需要传递给我的一个函数,这已被promisified,以及其他参数。 我search了高和低,但找不到这样做的语法的一个例子。 我甚至不知道我在做什么是正确的。 我发现的所有文章都解释了简单的承诺链,只通过.then()方法返回一个值。 没有一个能够将其转化为另一个function。 以下是我到目前为止: var bbPromise = require("./node_modules/bluebird"); var AWS = require("./node_modules/aws-promised"); var rp = require("./node_modules/request-promise"); var moment = require('./node_modules/moment.js'); var dynamodb = new AWS.dynamoDb(); exports.handler = function(event, context) { "use-strict"; // This gets a token that will be used as a parameter for a request function getToken(params){ return […]

蓝鸟承诺与事件发射器

我对使用蓝鸟承诺是相当新的。 我试图在发射器上使用它们。 但是,我被困在如何处理错误。 我有一个stream对象是发射器。 代码如下 – return new Promise((resolve, reject) => { var onDocFunc = doc => { //JSON.parse('*'); // some logic goes in here to construct setStmt bulk.find(query).upsert().update({$set: setStmt}); count++; if (count % bulkSize == 0) { stream.pause(); var execute = Promise.promisify(bulk.execute); execute().catch(() => {}).then(() => { stream.resume(); }); } }; stream.on('data', onDocFunc); stream.on('end', […]

如何在Node.js中同步使用请求?

这是我的基本脚本来刮一个给定的url,并获得其中的所有链接。 我想在请求函数完成后打印links_arr 。 但是,在这里请求callback函数被执行,所以,我得到一个空的数组打印。 我如何做到这一点同步? 即按以下顺序。 请求URL。 Cheerio获取所有链接。 我们遍历所有项目,并将它们插入到links_arr数组中。 打印数组。 PS我知道Node.js意味着asynchronous任务,但这是我需要履行的要求。 我看过Promise这样的东西可以帮助我,但是由于Node没有先进的知识,我不知道如何实现。 一些帮助将不胜感激。 我正在使用http请求的请求库,URLparsingurl和Cheerio的HTMLparsing。 var request = require('request'); var cheerio = require('cheerio'); var url = require('url'); var all_links = []; var processing = []; var processed = []; var base_url = "https://www.npmjs.com"; var base_host = "www.npmjs.com"; var analyze_href_sync = function(u){ console.log("Analysing URL "+u); url_obj = […]

在使用Promise.all()forEach呈现NodeJS页面之前,先加载Firebase数据,

我试图创build一个从Firebase加载多个数据集的页面,然后将它们传递给NodeJS呈现的页面。 我会感谢一些帮助,确保在forEach迭代之后发生这种情况; 即,我不确定如何让Firebase for each迭代成为我的承诺的一部分。 非常感谢! router.get('/', function(req, res, next) { var getBrands = brandRef.once('value').then(function(snapshot){ var brands = []; snapshot.forEach(function(childSnapshot){ console.log(childSnapshot.val()['name']); brands.push({'name' : childSnapshot.val()['name'] }); }); return brands; }); var getStores = storeRef.once('value').then(function(snapshot){ var stores = []; snapshot.forEach(function(childSnapshot){ stores.push({'name' : childSnapshot.val()['name'] }); }); return stores; }); var getProducts = productRef.once('value').then(function(snapshot){ var products = []; snapshot.forEach(function(childSnapshot){ […]