Tag: 蓝鸟

我如何处理承诺的错误?

作为节点程序员。 我习惯于使用“nodebacks”来处理我的代码中的错误: myFn(param, function(err, data) { if (err){ //error handling logic } else { // business logic } }); 在编写这个函数时,我可以这样做: var myFn = function(param, callback){ var calc = doSomeCalculation(param); if(calc === null) { // or some other way to detect error callback(new Error("error with calculation"), null); } … someAsyncOp(calcN,function(err, finalResult){ if(err) return callback(err, null); callback(null, […]

在第一级尝试抓住错误在JavaScript承诺

所以,我想我的第一级捕获是处理错误的一个。 无论如何要把我的错误传播到第一次接触? 参考代码,不工作(还): Promise = require('./framework/libraries/bluebird.js'); function promise() { var promise = new Promise(function(resolve, reject) { throw('Oh no!'); }); promise.catch(function(error) { throw(error); }); } try { promise(); } // I WANT THIS CATCH TO CATCH THE ERROR THROWN IN THE PROMISE catch(error) { console.log('Caught!', error); }

在之前和之后放置捕获物

我很难理解把.catch(function(err)BEFORE和AFTER then在嵌套promise中的区别。 test1Async(10).then(function (lol) { return test2Async(22) .then(function (lol) { return test3Async(100); }).catch(function (err) { throw "ERROR AFTER THEN"; }); }).then(function (results) { console.log(results); }).catch(function (err) { console.log(err); }); 和这个 test1Async(10).then(function (lol) { return test2Async(22) .catch(function (err) { throw "ERROR BEFORE THEN"; }) .then(function (lol) { return test3Async(100); }); }).then(function (results) { console.log(results); }).catch(function (err) […]

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被拒绝后停止正在运行的进程

我使用下面的代码工作正常,但问题是,当我得到一个错误,我希望它停止所有其他的承诺。 例如,如果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") […]

与fs和蓝鸟的承诺

我目前正在学习如何在nodejs中使用promise 所以我的第一个挑战是列出目录中的文件,然后使用asynchronousfunction获取每个步骤的内容。 我提出了以下的解决scheme,但有一种强烈的感觉,这并不是最优雅的方式,特别是第一部分,我将asynchronous方法“转向”承诺 // purpose is to get the contents of all files in a directory // using the asynchronous methods fs.readdir() and fs.readFile() // and chaining them via Promises using the bluebird promise library [1] // [1] https://github.com/petkaantonov/bluebird var Promise = require("bluebird"); var fs = require("fs"); var directory = "templates" // turn fs.readdir() into […]

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

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

将对象绑定到Promise.then()参数的正确方法

我发现了一个困难的方法,那就是不能简单地将对象的函数传递给蓝鸟。 我假设蓝鸟then正在做一些魔术,并在匿名函数中包装传递函数。 所以我附加了一个.bind的function,它的工作。 这是与蓝鸟做到这一点的正确方法? 还是有更好的办法? var Promise = require("bluebird") var Chair = function(){ this.color = "red" return this } Chair.prototype.build = function(wood){ return this.color + " " + wood } var chair = new Chair() //var x = chair.build("cherry") Promise.resolve("cherry") .then(chair.build.bind(chair)) // color is undefined without bind .then(console.log) 我知道这一切都不是asynchronous,所以请同步示例,我的用法是asynchronous。

我如何提交AWS JavaScript SDK?

我想用promise来使用JavaScript中的aws-sdk。 而不是默认的callback风格: dynamodb.getItem(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }); 我反而想用一个承诺风格: dynamoDb.putItemAsync(params).then(function(data) { console.log(data); // successful response }).catch(function(error) { console.log(err, err.stack); // an error occurred });