Articles of 承诺

ExpressJS / NodeJS / Promises:从承诺链早期返回

当我在服务器上发布一个请求来创build一个新的游戏时,我会执行一些查询。 首先,我search用户是否已经在游戏中,如果是,则返回游戏。 否则,我search一个开放的游戏,在这个游戏中有人正在等待对手,如果是这样的话,就返回那个游戏。 最后,如果没有发现上述状态的游戏,我创build一个新游戏并返回。 所以我的代码看起来像这样: .post( function(req, res, next){ …findUsersExistingGame… .then(function(game){ if(game){ return res.send(game); } else{ return …findUserWaitingForOpponentsGame… } } .then(function(game){ if(game){ return res.send(game); } else{ return …createNewGame… } }) .then(function(game){ return res.send(game); }) .catch(function(err){ return next(err); }); 我最终将每个函数重构为辅助函数,以提高可读性,但是我需要首先确定链接。 我的问题是,如果我在承诺链中早期发现一个游戏(即,有一个用户的现有游戏或另一个正在等待对手的用户),则返回res.send(游戏)。 然而,第三个.then会抛出一个错误,因为我以前的.then()语句返回undefined。 如果我想做一个res.send(游戏),我如何早日退出承诺链? 选项1:我已经看到了一些build议来抛出一个错误,并明确地捕捉错误,但是这种感觉从根本上是错误的,使用错误来控制stream量。 scheme2:我可以做这样的事情,而不是链接承诺,但是类似于“promise / callback hell”: .post( function(req, res, next){ …findUsersExistingGame… .then(function(game){ if(game){ return […]

Node.js:在parsing()被调用之前parsingPromise?

我对Node.js及其asynchronous行为很陌生。 我试图拿一个文件,保存它的副本,追加一行到复制的文件,并开始使用复制的文件 – 按顺序。 这大概是我现在所拥有的… var first = new Promise(function(resolve, reject) { console.log("1"); var readStream = fs.createReadStream("file.txt"); var writeStream = fs.createWriteStream("file-copy.txt"); readStream.on("end", function () { writeStream.end(); }); var pipeAction = readStream.pipe(writeStream); pipeAction.on("close", function() { console.log("2"); resolve(); }); }); var second = new Promise(function(resolve, reject) { console.log("3"); fs.appendFile("file-copy.txt", "\nA NEW LINE TO INSERT", function (err) { […]

在Promise返回函数中find第一个成功

给定一些function,返回承诺: function foo(arg) { return new Promise(function(resolve, reject) { if (stuff(arg)) { resolve('result from foo'); } else { resolve(null); } }); ); // … maybe more of these functions … function bar(arg) { return new Promise(function(resolve, reject) { if (otherStuff(arg)) { resolve('result from bar'); } else { resolve(null); } }); ); 我们怎样才能以串行方式迭代函数,在第一个函数返回一个非空值之后短路呢? [ foo, // […]

Nodejsexpression和承诺不做我期望的

我正在尝试使用NodeJS构build一个loginAPI,但是我的代码并没有达到我期望的效果。 我对js,承诺等都很陌生,所以请尽可能简化任何答案。 从我的代码输出中可以看到,第一个promise部分不会等到函数findUsers(…)完成。 我有一个路线文件,我想依次运行几个函数: 查找用户是否存在于数据库中 如果(1为真)散列并input密码 …等 路线文件现在包含: var loginM = require('../models/login'); var loginC = require('../controllers/login'); var Promise = require('promise'); module.exports = function(app) { app.post('/login/', function(req, res, next) { var promise = new Promise(function (resolve, reject) { var rows = loginM.findUser(req.body, res); if (rows.length > 0) { console.log("Success"); resolve(rows); } else { console.log("Failed"); reject(reason); } […]

从承诺中返回数据到中间件

我是新的nodejs,这可能看起来很平凡,但我从检索返回承诺的函数的数据时遇到问题。 中间件的响应被发送回前端。 这是我的代码 // middleware app.get('/player', function(req, res) { //data i want to return res.send(getPlayerStats.getPlayerId(req.query.name))); }); //getPlayerStats.js var getPlayerId = function(name) { return start(name) .then(getPlayerInGame) .then(getPlayerStats) .then(getPlayers); //.then(sendToSingular) } //getplayers function var getPlayers = function(data) { return data; } 我是以错误的方式发回数据? 我在前端看到的回应是一个具有原型作为唯一属性的对象。 我可以打印出getPlayers()中的数据,我发现它工作正常。

JavaScript的承诺 – 创build一个承诺一起执行的数组

我正在使用Node.js对noSQL DynamoDB进行asynchronous调用。 我首先查询该帐户属于哪个“好友列表”。 这可能会从零返回到“n”个新的主键,其中将包含每个这些好友列表的所有成员的列表。 把他们想象成一个人所属的俱乐部……你可能没有或多less; 每个俱乐部有几个成员甚至一个。 到目前为止(我在这里第一次使用Promises …虽然我已经在之前的JA项目中使用了callback函数),但是我知道我在哪里,但是我知道我错误地组装了Promise数组。 也就是说,我可以在控制台中看到.then函数在两个promise均parsing之前执行。 为了logging,我确实期望……任何一个单独的承诺解决都可以得到满足似乎是合理的。 不pipe怎样,有人可以提供一些关于如何构build的提示? 我想结束伪: getBuddyLists。然后(getAllTheBuddiesInTheLists).then(function(){// doSomething}); 我的Node.js代码: const AWS = require('aws-sdk'); const docClient = new AWS.DynamoDB.DocumentClient({region:'us-east-1'}); var buddyGroups = []; exports.handler = function(event, context, callback) { var params = { TableName: 'USER_INFORMATION', Key: { "DEVICE_ID": event.DEVICE_ID } }; var getBuddyList = new Promise(function(resolve, reject){ docClient.get(params, function(err, data){ […]

Javascript的承诺模式 – 区分错误

考虑这个代码块: getUser(userId) .catch(function(error){ crashreporter.reportError('User DB failed', error); // show user a generic error }) .then(function(user) { return chargeCreditCard(user); }) .catch(function(error){ crashreporter.reportError('Credit card failed', error); // show user an error saying that their credit card got rejected }) 显然,这个问题是THEN(USER)块在用户DB失败的情况下被执行。 另一个select是将第一个catch块移动到链的末尾。 但是,这会导致另一个问题! 我们将无法区分错误是来自User DB还是CreditCard。 下面的模式,我认为解决问题,认为是一个承诺反模式? 有没有更好的方法来做到这一点? 我看到的问题是,你可以在半callback地狱。 getUser(userId) .then(function(user) { return chargeCreditCard(user) .catch(function(error){ crashreporter.reportError('Credit card failed', error); […]

node.js函数返回未定义的值

我有一个问题,从数据库与node.js获得restaurantname,它似乎必须做一些callback参数,但我不能find我的情况的解决scheme,希望你们中的一个可以帮助我。 我做了一个从数据库中获取餐厅名称的函数。 第一个控制台日志行给出了正确的retvalue,第二个给出了未定义的,我怎么写代码,以便返回值是餐厅的名称? 亲切的问候,罗伯特 function restaurantName(id) { var retvalue; try { F.model('restaurant').load(id).then(function (restaurant) { retvalue = restaurant.Name; console.log('restaurantName 1(' + id + ')' + retvalue); }) } catch (err) { retvalue = 'Error'; } console.log('restaurantName 2(' + id + ')' + retvalue); return retvalue; };

承诺如何创build?

我对Promise对象的理解如下: var Promise = { then: function() { … }, catch: function() { … } }; 如果我有下面这个代码有一个函数,并返回一个Promise对象( fetch.js ): var xhr = require('xhr') module.exports = function (uri) { return new Promise(function (resolve, reject) { xhr(uri, function (err, res, body) { if (err) return reject(err) if (res.statusCode !== 200) return reject(new Error(body)) resolve(body) }) }) } […]

承诺不会按顺序执行javascript

我有下面的代码片段使用承诺执行。我有的问题是承诺没有执行顺序等待第一个块执行之前,继续下一个块 下面是代码: array[] new Promise(function(resolve, reject) { //userarray is some array with user id's userarray.forEach(function(entry) { User.findOne({ user_id: entry}, function(err, user) { if (err) throw err; console.log(user.name); array.push(user.name); }); }); resolve("success"); }) .then(function() { console.log(array); console.log("done"); }); 下面是输出 [] //数组仍然是空的 DONE 汤姆 迪克 掠夺 当我想要的是 汤姆 迪克 掠夺 [“汤姆”,“迪克”,“哈里”] DONE