Tag: 承诺

当函数返回一个promise时,是否有任何好处?

当你有一个不等待任何事情的函数,并返回一个承诺,你可以做到这一点。 这将返回一个你可以await的承诺。 function doSomethingAamzing ({id, animalType, accessToken}) { const url = `${url}/v1/${animalType}/${id}?access_token=${accessToken}` return request.get(url) } 这不是必要的,但我们可以做到这一点。 async function doSomethingAamzing ({id, animalType, accessToken}) { const url = `${url}/v1/${animalType}/${id}?access_token=${accessToken}` return await request.get(url) } 在后者更容易阅读为开发者,该函数是asynchronous的,并将返回一个承诺,这是不是很清楚的第一个function。 我认为使用后者更好的唯一原因是代码经历了一些可以从显式async语法中受益的静态代码分析。 当函数返回一个promise时,是否有任何好处?

在Node REPL中,promise中的副作用在定义函数时运行,而不是在调用时运行

这是Promise的行为,我没有预料到。 我得到承诺的asynchronous性质的吊and,并正在创造控制stream量的承诺序列。 但是,我担心我的控制stream的同步性没有得到尊重。 在下面的例子中,Promise的副作用看起来像在定义 Promise时被调用,而不是在运行时调用。 “副作用”,我特别指在这个例子中的console.log ,但在我的应用程序中,我也在我的Promiseparsing器中做了一些全局configuration。 在这个例子中,我正在运行一个相对最新版本的v5.11.2的nodejs REPL。 > testFn = new Promise(function(resolve, reject){ console.log("called when promise defined"); resolve("called when promise invoked") }) called when promise defined Promise { 'called when promise invoked' } > testFn.then(function(res){console.log(res)}) Promise { <pending> } > called when promise invoked 承诺是在调用函数之前计算出的resolve值还是reject值? 在这个REPL的例子中似乎是这样的。 我希望在called when promise defined testFn.then时候可以called when promise […]

Nodejs映射串行端口写入接收数据

我目前正在使用node-serialport模块进行串口通讯。 我会发一个命令ATEC ,它会回应ECHO 。 但是,这个发送和接收数据的过程是asynchronous的(在我发送数据之后,我不知道数据何时到达data事件),示例代码如下: //Register the data event from the serial port port.on('data', (data) => { console.log(data); }); //Send data using serialport port.write('ATEC'); 无论如何,我可以用这种方式来写吗? //When i send the command, I could receive the data port.write('ATEC').then((data)=> { console.log(data); }); 这可能实现吗? 在使用request客户端的http通信中,我们可以做类似的事情 request.get('http:\\google.com') .on('response', (res) => { console.log(res); }); 我想用serialport复制相同的行为

蓝鸟promise.all不尊重结果顺序

我正在使用最新的稳定的蓝鸟: "bluebird": "~3.4.0", 并用下面的代码: Promise.all([ParticipantsService.retrieveActiveParticipantsFromTheLocalDb(), EventService.retrieveActiveEventsFromTheLocalDb(), HeatService.retrieveActiveHeatsFromTheLocalDb()]).then( function (results) { var namedResults = {participants: results[0], events: results[1], heats: results[2]}; return res.render('runners/runners', namedResults); }).catch( function (err) { winston.error('Failed to retrieve participants and or event details', err); return res.send(err); }); 我希望namedResults总是有正确的顺序排列的元素匹配的承诺数组的顺序,但这是不正确的! 我每次都有不同的顺序。 我假设这是因为它是蓝鸟的文档上说的: http : //bluebirdjs.com/docs/api/promise.all.html除非我读这个错误… 谁能帮忙? 谢谢

用下划线地图做一些asynchronous的事情

function addSomething(data) { var defer = q.defer(); data = _.map(data, function(item) { item['something'] = callSomethingAsync(); return item; }); return defer.promise; } 我如何处理这个问题。 我发现的唯一方法是使用Async.js。 但也许有一个更好的方式使用$ q? 编辑: function getScopes(item) { var defer = q.defer(); var query = "SELECT somevalue FROM Something WHERE ID = '" + item.id + "'"; mysql.query(query, function(err, data) { if (err) { […]

JavaScript承诺依赖性处理

我有下面的代码示例。 var Promise = require('bluebird'); var model = function (object) { this.name = object.name; }; model.prototype.download = function () { var self = this; return new Promise(function (resolve, reject) { setTimeout(function () { resolve(); }, Math.random() * 100) }); }; model.prototype.process = function () { var self = this; return new Promise(function (resolve, reject) { […]

Promise.all无效迭代抛出生成器

试图了解Javascript生成器和承诺,我已经检查他们是好的ALAX。 我需要迭代抛出承诺的协程( Promise.coroutine来自Bluebird的libray),使得按照正确的顺序执行一些承诺是很容易的。 有了这个代码(抱歉延迟的反模式,我会学习,以避免它): function myPromise(x,time,i){ var deferred = Q.defer(); setTimeout(() => { deferred.resolve(x + i); },time); return deferred.promise; } router.get('/', function(req, res, next) { for (var i = 0; i < 5; i++) { Promise.coroutine(function*(i) { var a = yield myPromise('a',6000,i); var b = yield myPromise('b',1000,i); console.log(a,b); })(i) .then(() => { console.log('Then'); }). catch((err) […]

如何使用默认捕获和处理程序创buildPromise

我正在创build一个使用koa和babelasynchronous/等待的API 我的控制器函数中的每一个承诺看起来像这样 async function … { await Promise … .then(data => response function) .catch(err => err function) } 每个承诺都有完全相同的响应和错误function。 有没有办法让我自动地使用相同的then / catch解决每个承诺(就像promise的默认parsing函数一样)。 然后我的代码看起来像这样: async function … { await Promise … } 承诺会自动解决/捕获。

Promise.promisify后无法读取undefined的属性

let nasPath = ""; return getFamInfo(args.familyID) .then(function (famInfo) { nasPath = //some code involving famInfo here return getSFTPConnection(config.nasSettings); }).then(function (sftp) { const fastPutProm = Promise.promisify(sftp.fastPut); return fastPutProm(config.jpgDirectory, nasPath, {}); }); 如果我在const fastPutProm = Promise.promisify(sftp.fastPut);之后放置断点const fastPutProm = Promise.promisify(sftp.fastPut); , fastPutProm是一个带三个参数的函数。 但是,当我尝试运行此代码时,我得到一个TypeError: Cannot read property 'fastPut' of undefined错误的TypeError: Cannot read property 'fastPut' of undefined 。 我在这里做错了什么?

bluebirdjs的承诺包裹在for循环内

我有一堆用于向我的服务提供数据的函数。 我想循环通过它们中的每一个,并在其中一个返回所需的结果时立即停止。 如果第一个工作,那很好。 如果它有一个例外或数据无效,我想移动到下一个等等。 我怎么能做到这一点? 我有下面的代码: handleData: function(address) { var self = this; return new Promise(function (resolve, reject) { for (var i = 0; i < self.listAllAvailableProviders.length; ++i) { var handler = self.listAllAvailableProviders[i]; new handler().getData(address) .then(function(value) { Logger.info(value); resolve(value); }) .catch(function(err){ Logger.error(err); }) } reject(""); }); } 我怎样才能解决它停止,只要第一个得到正确的数据? 我已经阅读bluebirdjs文档无济于事。 编辑我resolve后,把一个break语句,我得到这个: SyntaxError: Illegal break statement at […]