Tag: 承诺

什么是诺言?

我不明白Everyauth的承诺是什么。 我看到我需要返回一个承诺对象或用户,但什么是everyauth承诺?

在循环中使用带fs.readFile的Promise

我想了解为什么下面的承诺设置不起作用。 (注意:我已经用async.map解决了这个问题,但是我想知道为什么我的下面的尝试不起作用。) 正确的行为应该是:bFunc应该运行尽可能多的时间fs读取所有的图像文件(bFunc下面运行两次),然后cFunc控制台打印“结束”。 谢谢! 尝试1:它运行并停在cFunc()。 var fs = require('fs'); bFunc(0) .then(function(){ cFunc() }) //cFunc() doesn't run function bFunc(i){ return new Promise(function(resolve,reject){ var imgPath = __dirname + "/image1" + i + ".png"; fs.readFile(imgPath, function(err, imagebuffer){ if (err) throw err; console.log(i) if (i<1) { i++; return bFunc(i); } else { resolve(); }; }); }) } function cFunc(){ […]

EventEmitter在一个Promises链中间

我正在做一些事情,包括按顺序运行一系列的child_process.spawn() (做一些设置,然后运行调用者感兴趣的实际命令,然后做一些清理)。 就像是: doAllTheThings() .then(function(exitStatus){ // all the things were done // and we've returned the exitStatus of // a command in the middle of a chain }); 所有的doAllTheThings()都是这样的: function doAllTheThings() { runSetupCommand() .then(function(){ return runInterestingCommand(); }) .then(function(exitStatus){ return runTearDownCommand(exitStatus); // pass exitStatus along to return to caller }); } 在内部我使用child_process.spawn() ,它返回一个EventEmitter ,我有效地从runInterestingCommand()返回close事件的结果返回给调用者。 现在我还需要将data事件从stdout和stderr发送到调用者,这些也来自EventEmitter。 有没有办法让(Bluebird)Promises这个工作,或者他们只是在阻碍EventEmitters发出多个事件? […]

是否有纯粹的基于Promise的方法来映射/连接集合?

asynchronous与Q一般 我正在学习Node.js开发,并试图围绕pipe理asynchronous“callback地狱”的策略包装我的大脑。 我探索的两个主要策略是Caolan McMahon的asynchronous模块和Kris Kowal的基于承诺的Q模块。 像许多其他人一样,我仍然在努力去理解什么时候应该使用一个而不是另一个。 但是,总的来说,我已经发现许诺和基于Q的代码稍微直观一点,所以我一直在朝着这个方向前进。 一般地映射/连接集合 不过,我仍然坚持使用asynchronous模块的function来pipe理集合 。 从Java和Python的背景来看,大多数时候我使用一个集合,逻辑如下所示: 初始化一个新的空集合,在其中存储结果。 对旧集合执行for-each循环,对每个元素应用一些逻辑并将结果推送到新的空集合中。 当for-each循环结束时,继续使用新的集合。 在客户端JavaScript中,我习惯于使用jQuery的map()函数 …传递第2步的逻辑,并将第3步的结果作为返回值。 感觉像相同的基本方法。 使用asynchronous和Q映射/连接集合 节点端asynchronous模块具有相似的映射和连接function,但是它们不会将连接结果返回到原始范围级别。 你必须下降到callback地狱使用结果。 例: var deferred = Q.defer(); … var entries = [???]; // some array of objects with "id" attributes async.concat(entries, function (entry, callback) { callback(null, entry.id); }, function (err, ids) { // We now have the […]

Promise被拒绝后停止正在运行的进程

我使用下面的代码工作正常,但问题是,当我得到一个错误,我希望它停止所有其他的承诺。 例如,如果chi.getCommand(val1, val2)将发送一个拒绝,我得到了exception捕获,我想取消对chss.exe和app.getStatus(12);的承诺app.getStatus(12); 我怎样才能做到这一点? var start = Promise.all([ chi.getCommand(val1, val2), chi.findAndUpdateCustomer() ]).spread(function (command, customer) { return chss.exe(runnableDoc, command, customer) .delay(10) .then(function (val) { if (val) console.log(val); return app.getStatus(12); }); }).catch(function (err) { // catch and handle errors and when it come to here I want it to stops all the chain above }); 这是get命令的代码简而言之: function […]

我打破了我的承诺

所以..我最难学习如何承诺。 我使用bluebird ( https://github.com/petkaantonov/bluebird )build议给我 – 为了驯服我的回拨地狱我已经越来越。 例: function login(req,res,con,mysql,P) { var ref = undefined; con.getConnection(function(err,connection) { if (err) console.log("Get Connection Error.. "+err); con.query('SELECT password,id FROM player WHERE name='+mysql.escape(req.body.user),function(err,rows,fields) { if (err) throw err; if (!rows[0]) { res.send({ "msg":"Your username and or password was incorrect.", "flag":true, "title":": Login Failed" }); } if (rows[0].password !== "undefined") […]

创build一个空的承诺

我有一个承诺的function,可能会或可能不会做一些事情。 例如 getYear().then(function(results){ if(results.is1999) return party(); else return Q.fcall(function(){/*do nothing here*/}); }).then(sleep) 在哪里, party , sleep都会回来。 有没有更简洁的方式来写入else语句? 也就是说,什么都不做,但还是会回报一个可以链接的承诺?

我可以通过在节点的全局范围内执行蓝鸟来覆盖ES6的承诺吗?

我想使用蓝鸟的Promise / A +开放标准的实现,并重写本地ES6 Promise 。 我还希望bluebird实现在随后导入的模块中随处可用,而不必在每个模块中都要求。 蓝鸟的入门页面告诉我: var Promise = require("bluebird"); ,这导致覆盖原生的Promise元素。 因为蓝鸟是规范的超集,它不会破坏现有的代码,因此应该是安全的使用。 但是,因为我知道这被认为是不好的做法: 扩展或取代原生语言,和 定义全局variables,以便在依赖于它的需求链中使用 ,当我想将其包含在节点应用程序的基本脚本中时,我很谨慎: import Promise from 'bluebird'; global.Promise = Promise; 这是不好的做法? 我应该坚持在每一个文件中导入蓝鸟吗?

exception处理,在promise中引发错误

我正在运行外部代码作为第三方扩展到node.js服务。 API方法返回promise。 一个已经解决的承诺意味着行动成功,一个失败的承诺意味着进行这个行动有一些问题。 现在,这是我有麻烦的地方。 由于第三方代码是未知的,可能会有错误,语法错误,types问题,以及可能导致node.js抛出exception的任何事情。 但是,由于所有代码都包含在承诺中,所以这些抛出的exception实际上是作为失败的承诺而回来的。 我试图把函数调用放在一个try / catch块中,但是它从来没有被触发: // worker process var mod = require('./3rdparty/module.js'); try { mod.run().then(function (data) { sendToClient(true, data); }, function (err) { sendToClient(false, err); }); } catch (e) { // unrecoverable error inside of module // … send signal to restart this worker process … }); 在上面的伪代码示例中,当抛出一个错误时,它在失败的promise函数中出现,而不在catch中。 从我所读到的,这是一个function,而不是一个问题,承诺。 然而,我总是无法理解,为什么你总是想要把exception和预期的拒绝完全一样。 一种情况是关于代码中的实际错误,可能无法恢复 […]

Promise.resolve()。然后vs setImmediate vs nextTick

NodeJS 0.11以及io.js和Node 0.12分支均附带原生承诺。 Native承诺有一个.then方法 ,总是在将来的事件循环中执行。 到目前为止,自从我从nextTick切换到现在,我一直使用setImmediate将事物setImmediate到事件循环的下一个迭代中: setImmediate(deferThisToNextTick); // My NodeJS 0.10 code process.nextTick(deferThisToNextTick); // My NodeJS 0.8 code 由于我们现在有一个新的方法来做到这一点: Promise.resolve().then(deferThisToNextTick); 我应该用哪个? 另外 – Promise.resolve.then行为像setImmediate或像nextTick关于事件循环之前或之后运行的代码?