Tag: es6 promise

在NodeJS,JXcore等下可能运行的代码如何检测它是否在支持本机ES6承诺的环境中运行?

例如,我有当前版本的官方Joyent NodeJS,当然还有Google V8 JavaScript引擎,还有带有Mozilla SpiderMonkey JavaScript引擎的JXcore。 前者似乎来源于原生的诺言支持,后者似乎不是。 (当然,这些并不是nodeJS代码可能运行的唯一两种可能的环境。 我的代码如何testing它的环境以查看它是否可以使用本机Promise? 在这种情况下,如果它检测到一个合适的polyfill是“本地的”就可以了。 但是它不应该检测出像Q这样的本地承诺。 (或者让我知道,如果我错了这个。)

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 […]

Promise.prototype.then()行为

我有这个承诺: var seasonalityArray; … aService.gettingAnalysis(site, cohortKey) .then(function (result) { let date = moment(); seasonalityArray = result.cooling.getSeasonMonths(date); }) , function (error) { console.error('An error occurred', error); }; const totalAccounts = _.size(report.asModel().accountNumbers); const warnings = _.compact(_.map(seasonalityArray, function (monthLabel) { … })); … aService.gettingAnalysis = function (site, Key) { return Promise.all([ aService.findingHeat(site, Key), aService.findingCool(site, Key) ]).spread(function (heating, cooling) […]

Promise在asynchronous操作完成之前parsing

我想调用Google Maps API并使用结果调用另一个API(这是我的最终目标,现在我只想将结果打印到控制台)。我的问题是,promise在API之前解决调用,并最终导致未定义的结果。 routes.js const express = require('express'); const router = express.Router(); const geospacial = require('./geospacial.js'); const trailapi = require('./trailapi.js'); router.get('/', (req, res, next) => { res.render('index'); }); router.post('/', (req, res, next) => { let activity = req.body.activity; let radius = req.body.radius; let getUserCoords = new Promise((resolve,reject) => { let userCoords = geospacial.getCoords(req.body.zip); resolve(userCoords); }); […]

ES6 Dyanmic Promise从arrays链接

脚本 我有一个我需要下载的URL数组,但每个都必须提供唯一的事务ID,必须从服务器请求,并且只有在请求成功时才会增加。 问题 当我循环访问数组时,我需要等待事务ID的请求和文件的请求,然后开始下一个迭代循环,但是文件的数量不是固定的,所以需要dynamic地构build一个链承诺。 伪代码 下面是一些伪代码,getFiles()是问题,因为所有的请求获得相同的事务ID,因为他们不等待前一个请求完成。 function getTransationId(){ return new Promise((resolve,reject)=> { let id = getNextTransactionId(); if(id!=error){ resolve(id); }else{ reject(error); } }) } function getFile(url, transactionId){ return new Promise((resolve,reject)=>{ http.request(url+transactionId, function(err,response){ if(err){ reject(err); }else{ resolve(response); } }); }); } function getFilesFromArray(urlArray){ for(let url of urlArray){ getTransactionId().then(resolve=>getFile(url,resolve),reject=>console.error(reject)); } } 题 我如何dynamic链式承诺? 回答 这是一个Ovidiu的回答JSFiddle

JavaScript的承诺链 – 为什么不工作?

在下面的代码中,有人可以解释为什么在Promise链中调用secondMethod()工作,但调用secondMethod()不? function firstMethod() { return new Promise(function(resolve, reject){ setTimeout(function() { console.log('first method completed'); resolve(); }, 2000); }); }; function secondMethod() { return new Promise(function(resolve, reject){ setTimeout(function() { console.log('second method completed'); resolve(); }, 2000); }); }; function thirdMethod() { return new Promise(function(resolve, reject){ setTimeout(function() { console.log('third method completed'); resolve(); }, 3000); }); }; // Works firstMethod().then(secondMethod).then(thirdMethod); […]

正确处理Node Promise中的asynchronousMongo操作

我有一个执行多个Mongo操作的函数,最后一个操作是在所有其他操作完成后closures数据库。 我对这个问题的处理相当有信心,但是我有一些外部的意见引起了关注,我想validation我的解决scheme是否正确。 build议的解决scheme: function updateDatabase (name, token) { return new Promise((resolve, reject) => { MongoClient.connect(MONGODB_URL) .then( (database) => { return database.collection('testCollection').update({name}, {$pull: {tokens: {$in: [token]}}}) .then( () => { database.collection('log').insert({ name, token }); return database; }) }) .then( (db) => { db.close(true); resolve(`Invalid token: ${token} has been removed from: ${name}`); }) .catch( (err) => { […]

我如何创build一个像钻石一样的js承诺链

我坚持承诺。 说我的程序结构是这样的 Func A //gets data then passes to I1 and J2 / \ Func I1 Func J1 //then route I & J run without interaction | | Func I2 Func J2 \ / Func B //Func B gets both the result of both 我有一些麻烦得到这个工作。 我就是这样 getdata.then(data=>{ var methods = Promise.all([ funci1.x(data).then(output=>{ funci2.x(output) }), funcj1.x(data).then(output2=>{ […]

需要关于嵌套Promises.all的build议

玩现代的JS,并与以下几点卡住了。 考虑通过一些HTTP API和本地Mongo实例来访问ExtSystem。 它们都包含name和id对象。 对于Mongo,我在ObjectSchema模型( {_id, sourceId, name, internalParam} )中使用sourceId {_id, sourceId, name, internalParam}其中sourceId等于来自ExtSystem的id ,而internalParam只存在于我的应用程序中。 ExtSystem有两个方法返回request.js Promise: ExtSystem.all返回ids [id, id, id]数组 ExtSystem.get返回对象本身{id, name} 还有一个全局函数errHandler可以处理来自request.js和errHandler Promises的错误。 要实现的目标是将Mongo与ExtSystem同步:在Mongo中更新ExtSystem中的所有对象,并从Mongo中删除不再存在于ExtSystem中的对象。 我想到了什么: ExtSystem.all().then(body => { let basket = []; // will store all promises for both ExtSystem and Mongo requests basket.push(…body.map(o => ExtSystem.get(o.id)); basket.push(ObjectSchema.find({}, 'sourceId')); Promise.all(basket).then(basketDoc => { let mongoObjects […]

并发活动的语言同步('map-reduce')在节点中?

编辑 感谢答复,我有一个工作版本。 问题结束时的代码; 感谢@estus和@Jared的帮助。 原来的问题 我的方式进入节点,并试图获得并发处理。 从一个简单的例子开始:给定两个文件的名字,确定哪个更大。 常规(顺序)解决scheme: var fs = require('fs'); var fname1=process.argv[2] var fname2=process.argv[3] var stats1 = fs.statSync(fname1) size1=stats1["size"] var stats2 = fs.statSync(fname2) size2=stats2["size"] if(size1 > size2) { console.log(fname1 + " is bigger") } else if (size2 > size1) { console.log(fname2 + " is bigger") } else { console.log("The files are the same […]