Tag: 蓝鸟

如何使用诺言来做串行任务?

所以我有4个任务: getStatus() , updateStatus(A) , getTask() , updateTask() ,它应该以这种方式执行: getStatus(function(status) { // A updateStatus(status, function(status) { // B getTask(function(task) { // C updateTask(task, function(task) { // D }) }) }) }) 所以为了避免callback地狱,我用诺言,现在所有这四个任务都返回一个诺言,然后我改变了这个方式 getStatus().then(function(status) { // A updateStatus(status).then(function(status) { // B getTask().then(function(task) { // C updateTask(task).then(function(task) { //D }) }) }) }) 正如你所看到的,它仍然是then hell , 我对Promise做错了什么?

承诺尽pipe拒绝履行

我正在使用蓝鸟解决方法检查承诺的结果,不pipe任何拒绝。 在第二种方法中,我拒绝了我仍然得到的承诺isFulfilled() true。 var Promise = require('bluebird'); Promise.settle([firstMethod, secondMethod]).then(function(results){ console.log(results[0].isFulfilled()); console.log(results[1].isFulfilled()); // console.log(results[1].reason()); }).catch(function(error){ console.log(error); }); var firstMethod = function() { var promise = new Promise(function(resolve, reject){ setTimeout(function() { resolve({data: '123'}); }, 2000); }); return promise; }; var secondMethod = function() { var promise = new Promise(function(resolve, reject){ setTimeout(function() { reject((new Error('fail'))); }, 2000); }); […]

如何有可变数量的蓝鸟承诺? (的NodeJS)

我有一个空的文件数组。 let arrayOfDocuments = []; 我想调用http请求(使用superagent)来下载一个文本文件,并将其内容放入我的arrayOfDocuments。 request.get('docs.google.com/document/d/SOME_FILE_NAME').then((res) => { arrayOfDocuments.push(res.text); }); 我得到的那部分,但这是棘手的部分。 我想把它放在一个for循环中,并在for循环之后做一些事情。 如此: for (let i = 0; i < numOfLinks; i++) { // send the http requests as above } //do stuff here but only after the above for loop is finished. 如果循环结束,我只能做最后一行? 现在我的程序运行的方式,for循环之后的代码在http请求得到响应之前运行并完成。 我认为有一种方法可以使用蓝鸟诺言做到这一点,但我不确定。 谢谢!

诺言瀑布

我是一个API开发人员,通常写端点需要从一个asynchronous调用结果传递到另一个asynchronous调用又名asynchronous瀑布。 我通常使用promise来做到这一点: task1() .then(result1){ task2(result1) .then(result2){ task3(result2) .then(result3){ // API response }) .catch(function(err){ // Task 3 handle err }) }) .catch(function(err){ // Task 2 handle err }) }) .catch(function(err){ // Task 1 handle err }) 很明显,使用callback函数没有太多的收获。 现在我得到了“承诺地狱”,而不是“回拨地狱”。 我曾经看过npm蓝鸟,但是似乎没有支持瀑布的承诺。 有时我会使用asynchronous并包装的任务返回一个承诺: const tasks = [ job1: function(cb){ task1() .then(function(result){ cb(null, result); }) .catch(function(err){ cb(err); }) }, job2: […]

我可以在参数中使用承诺吗?

我有两个function: 第一个使一个http post来获得一个xmlstring function post(url, formData) { return new Promise(function (resolve, reject) { // make an http post and get results (xml string) request(url, formData, function(error, xml) { if (error) reject(error) resolve(xml) }) }) } 把xml转换成一个对象 function xmlToObject(xml) { return new Promise( function (resolve, reject) { // transform xml string to an object using xml2js […]

为什么使用promise的asynchronousIO会生成一个零长度的文件?

任何人都可以找出这个代码有什么问题吗? 我试图写一个文件的less量字节,我得到的是一个零长度的文件没有错误报告。 我试图在node.js中使用asynchronous文件IO和bluebird promise来将一些数据写入本地文件。 我已经使用callback函数成功编写了此函数的同步版本和asynchronous版本。 但是,因为callback版本嵌套地狱,有各种各样的error handling问题,并不容易维护,我想我会尝试一个版本使用承诺,而不是因为这应该是它的长处(更好的error handling,更less的嵌套,更容易顺序asynchronous操作)。 不幸的是,承诺版本只会导致长度为零的文件。 以下是承诺版本的代码: // at initialization time var Promise = require('bluebird'); var fs = Promise.promisifyAll(require('fs')); // code in a function var header = new Buffer('[temperatures] {"formatVersion": "1", "fields": ["t", "atticTemp", "outsideTemp"]}\r\n'); filename += ".new"; console.log("async write started"); var fd; fs.openAsync(filename, "w", 438).then(function(ffd) { fd = ffd; return fs.writeAsync(fd, […]

处理承诺链中的多个捕获

我仍然是相当新的承诺,目前正在使用蓝鸟,但我有一个场景,我不太清楚如何最好地处理它。 因此,例如我有一个快速应用程序中的承诺链如下所示: repository.Query(getAccountByIdQuery) .catch(function(error){ res.status(404).send({ error: "No account found with this Id" }); }) .then(convertDocumentToModel) .then(verifyOldPassword) .catch(function(error) { res.status(406).send({ OldPassword: error }); }) .then(changePassword) .then(function(){ res.status(200).send(); }) .catch(function(error){ console.log(error); res.status(500).send({ error: "Unable to change password" }); }); 所以我后面的行为是: 去Id获得帐户 如果在这一点上被拒绝,就会炸毁并返回一个错误 如果没有错误,则将返回的文档转换为模型 validation数据库文档的密码 如果密码不匹配,然后炸出来,并返回一个不同的错误 如果没有错误更改密码 然后返回成功 如果还有其他问题,请退回500 所以目前的捕捉似乎并没有停止链接,这是有道理的,所以我想知道是否有一种方法让我以某种方式迫使链条停止在某个点上的错误,或者如果有更好的方法构造这个以获得某种forms的分支行为,因为存在if X do Y else Z 。 任何帮助将是伟大的。

捕捉Bluebird中的setinterval函数中引发的错误

this.custFunc = Bluebird.method(function (id)) { var interval = setInterval(function () { calc(id) .then(function (flag) { if (flag) { execProg(id, interval); } }) .catch(function (err) { return Bluebird.reject(err); }); }, pollingInterval); }); 如何捕获在setinterval函数内抛出的错误? 我无法弄清楚

asyncawait模块(节点)产生不可用的堆栈跟踪

我在使用node.js( https://github.com/yortus/asyncawait )的async / await实现时遇到问题。 在文档中说“将包括一个可用的堆栈跟踪” 。 但是对我来说并不是这样。 所以我觉得我做错了..但我不知道我做错了什么。 为了演示,我将比较“香草”bluebird示例的stacktrace与相应的asyncawait代码的相应堆栈跟踪(asyncawait在内部使用bluebird,所以我认为这是公平的)。 首先没有asyncawait的蓝鸟代码: var funcB = function() { return Promise.resolve().then(function() { throw new Error("some err"); }) }; var funcA = function() { return funcB(); }; gulp.task("aa",function(cb) { funcA().then(function() { cb(); }); }); 一开始,stacktrace产生信息“funcA – > funcB – > exception”。 没有更好的! Error: Error: some err at processImmediate [as […]

mongoose承诺不传递数据到下一个链

我用promise来查询MongoDB。 结果只能在第一个.then(function(results){ // can send the result from here..}) 。 但是,当我操纵结果,并将其传递给下一个.then()链,它是不可访问的。 以下是完整的function。 exports.getAcl = function(req, res) { User.findAsync({}, { acl: 1 }) .then(function(results){ var aclList = []; results.forEach(function(result,index,arr){ aclList[result._id] = result; if (index === (arr.length – 1)) { console.log('I can log the aclList here..', aclList) return aclList // But neither able to send it to […]