Tag: 承诺

我如何使用Bluebirderror handling程序?

介绍 这个问题的目的是最终解决我在Bluebird开发中遇到的一个问题。 不过,我也借此机会澄清了一些事情,所以会有一些问题。 我也会提前道歉,在阅读故事的过程中,您可能会感受到任何混乱或无聊的感觉。 问题 据我的理解,蓝鸟试图聪明地捕捉到被忽略的拒绝,根据以下策略: 第二种方法,默认情况下是蓝鸟,如果拒绝未被第二回合开始处理,则调用注册处理程序。 – Bluebird自述文件#error handling 现在这里是第一个问题: “第二个回合的开始”是什么意思? 在同一部分的后面,logging如下: 当然,这不是完美的,如果你的代码由于某种原因需要猛扑一下,并且在承诺挂了一段时间之后附加了error handling函数,那么你会看到恼人的消息。 在这种情况下,您可以使用.done()方法来指示应该抛出任何悬挂exception。 – Bluebird自述文件#error handling 现在,我相信我碰到了上面描述的情况,我的用例如下: 我调用一个函数,它将为我提供附加.catch()的承诺: lib.loadUrls() .catch(function(e){console.log(e);}); 在内部,该函数从URL1加载内容并基于内容,依次从URL2加载内容: lib.loadUrls = return this.loadUrl1() .then(this.loadUrl2.bind(this)) 如果在这个链中的第二个承诺被拒绝,错误首先由catch处理,然后由Bluebirds处理,也Possibly unhandled error处理程序。 这最后一个行为是不需要的,我不明白为什么这样做。 所以问题二可能是: 为什么,尽pipe附加和执行error handling程序,蓝鸟仍然认为错误的可能性是“未处理”? 我在想,很明显,在拒绝传播给.catch()的时候,这个承诺“一直悬而未决”。 在这种情况下,我应该通过“使用.done() ”来解决它(根据引用的文档)。 现在,我已经尝试了几件事情,但是我不太清楚如何在这个场景中“使用.done”。 (这没有帮助.done()返回undefined,阻止我从.finally -ing。) 所以这就介绍了我的第三个和第四个问题: 在这种情况下如何使用.done() ,以及如何明确地结束承诺链,但仍然附加.finally() 编辑1:我创build了一些JSFiddles重现该错误: 使用蓝鸟1.0.5重现了错误。 使用最新的Bluebird.js再现了这个bug(在这个时候) 使用Beta版本0.10.0-1 不会重现该错误。 编辑2:开发人员修复了这个错误。

用蓝鸟承诺进行asynchronousexception处理

什么是处理这种情况的最佳方法。 我在一个受控制的环境中,我不想崩溃。 var Promise = require('bluebird'); function getPromise(){ return new Promise(function(done, reject){ setTimeout(function(){ throw new Error("AJAJAJA"); }, 500); }); } var p = getPromise(); p.then(function(){ console.log("Yay"); }).error(function(e){ console.log("Rejected",e); }).catch(Error, function(e){ console.log("Error",e); }).catch(function(e){ console.log("Unknown", e); }); 当从setTimeout中抛出时,我们总是会得到: $ node bluebird.js c:\blp\rplus\bbcode\scratchboard\bluebird.js:6 throw new Error("AJAJAJA"); ^ Error: AJAJAJA at null._onTimeout (c:\blp\rplus\bbcode\scratchboard\bluebird.js:6:23) at Timer.listOnTimeout [as ontimeout] (timers.js:110:15) 如果throw在setTimeout之前发生,那么bluebirds […]

如何使用快速应用程序内的承诺?

我试图在app.get函数中使用promise,它将运行一个将在promise上运行的查询。 但问题是回应不等待诺言,只是回应。 任何想法如何代码应该如此承诺可以住app.get内快速应用程序?

承诺重试devise模式

编辑 继续重试直到承诺解决的模式(使用delay和maxRetries)。 继续重试直到条件符合结果(具有延迟和maxRetries)的模式。 具有无限次重试的内存高效dynamic模式(提供延迟)。 代码为#1。 不断重试,直到承诺解决(语言等任何改进社区?) Promise.retry = function(fn, times, delay) { return new Promise(function(resolve, reject){ var error; var attempt = function() { if (times == 0) { reject(error); } else { fn().then(resolve) .catch(function(e){ times–; error = e; setTimeout(function(){attempt()}, delay); }); } }; attempt(); }); }; 使用 work.getStatus() .then(function(result){ //retry, some glitch in the system […]

为什么不能内联调用res.json?

我有和expressjs应用程序,并在特定的路线我调用一个函数,通过调用res.json与数据库文件作为参数与数据库中的用户响应。 我使用基于承诺的库,我想内联的callback,我把数据库文件的响应。 但是当我这样做的时候程序就会失败。 有人可以解释为什么吗? 我也想知道为什么内联调用console.log实际上工作。 两个方法res.json和console.log之间有一些根本的区别吗? 这是一个什么工作,什么不工作的例子。 假设getUserFromDatabase()返回用户文档的承诺。 //This works var getUser = function(req, res) { getUserFromDatabase().then(function(doc) { res.json(doc); }); } //This does not work (the server never responds to the request) var getUserInline = function(req, res) { getUserFromDatabase().then(res.json); } //This works (the object is printed to the console) var printUser = function(req, res) { […]

在JavaScript中的思考诺言(蓝鸟在这种情况下)

我试图让我的头一些不那么微不足道的承诺/asynchronous使用情况。 在一个例子中,我现在正在摔跤,我有一个从一个knex查询(可数组)返回的书籍数组,我想插入到数据库中: books.map(function(book) { // Insert into DB }); 每本书的内容如下所示: var book = { title: 'Book title', author: 'Author name' }; 但是,在插入每本书之前,我需要从一个单独的表中检索作者的ID,因为这些数据是正常的。 作者可能也可能不存在,所以我需要: 检查作者是否存在于数据库中 如果是,请使用此ID 否则,插入作者并使用新的ID 但是,上述操作也都是asynchronous的。 作为插入操作的先决条件,我可以只使用原始映射中的承诺(获取和/或插入标识)。 但是这里的问题在于,因为所有东西都是asynchronous运行的,代码可能会插入重复的作者,因为初始的check-if-author-exists与insert-a-new-author块是分离的。 我可以想出几个办法来达到上述目的,但都涉及分拆承诺链,一般显得有些杂乱。 这似乎是一个相当普遍的问题。 我确定我在这里错过了一些基本的东西! 有小费吗?

如何识别下面的代码模式

我有一个js承诺的模式,我想确定几个关键字 例如,如果我把这样的代码: var deferred = Q.defer(); 而在文件中,我也有以下各自的价值 deferred.reject(err); deferred.resolve(); return deferred.promise; 完整的代码 例1 function writeError(errMessage) { var deferred = Q.defer(); fs.writeFile("errors.log", errMessage, function (err) { if (err) { deferred.reject(err); } else { deferred.resolve(); } }); return deferred.promise; } 我想如果我把大的代码文件(作为string) ,发现这个文件包含模式 另一个例子 var d = Q.defer(); / *或$ q.defer * / 而在文件中,你也有以下各自的价值 d.resolve(val); d.reject(err); return d.promise; […]

如何避免在条件expression式中的coffeescript隐式“返回”?

我正在实现一个函数具有延迟值返回,并在函数内我有很多嵌套的条件expression式: 例如: deferred = Q.defer() FS.readFile("foo.txt", "utf-8", (error, text) -> if error deferred.reject(new Error(error)) else deferred.resolve(text) ) return deferred.promise 比将编译成: var deferred; deferred = Q.defer(); FS.readFile("foo.txt", "utf-8", function(error, text) { if (error) { –> return <– deferred.reject(new Error(error)); } else { –> return <– deferred.resolve(text); } }); return deferred.promise; 我只需要最后一个返回,但不是if / else返回(即– >返回< –在编译的代码中) 我怎样才能避免coffeescript编译器这样的行为(不需要隐式返回)?

在Sequelize事务中使用循环和promise

我目前正在构build一个Nodejs,Express,Sequelize(w。PostgreSQL)应用程序,并且遇到了一些使用promise和transaction和loops的问题。 我想弄清楚如何在事务中使用for循环。 我试图通过成员列表循环,并在数据库中为每个成员创build一个新的用户。 我知道下面的代码是错误的,但它显示了我正在尝试做什么。 任何人都可以指向正确的方向吗? var members = req.body.members; models.sequelize.transaction(function (t) { for (var i = 0; i < members.length; i++) { return models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}).then(function(user) { return user.addInvitations([group], {transaction: t}).then(function(){}).catch(function(err){return next(err);}); }) }; }).then(function (result) { console.log("YAY"); }).catch(function (err) { console.log("NO!!!"); return next(err); });

如何使用asynchronousI / O将实时数据集写入磁盘?

我是在node.js中开发的新手(尽pipe在客户端JavaScript方面经验相对丰富),并且在处理node.js中的asynchronous操作时遇到了很多关于良好实践的问题。 我的具体问题(虽然我想这是一个相当通用的主题)是,我有一个node.js应用程序(在树莓派上运行),每隔10秒将数个温度探测器的读数logging到内存数据结构中。 这工作得很好。 数据随着时间在内存中积累,随着数据积累并达到特定的大小阈值,数据会定期老化(只保留最后N天的数据)以防止数据增长超过一定的大小。 这个温度数据被用来控制一些其他的电器。 然后,我有一个单独的间隔计时器,每隔一段时间将这些数据写出到磁盘(如果进程崩溃,则保留它)。 我使用asynchronousnode.js( fs.open() , fs.write()和fs.close() )磁盘IO将数据写入磁盘。 而且,由于磁盘IO的asynchronous特性,在我看来,我试图写入磁盘的数据结构可能会在我写入磁盘的过程中被修改。 这可能是一件坏事。 如果在将数据写入磁盘时数据只附加到数据结构中,那么实际上并不会导致写入数据的方式出现问题,但是在某些情况下,在logging新数据时可能会修改较早的数据这真的会弄乱我在写入磁盘过程中的完整性。 我可以想到我可以在我的代码中使用各种有点丑陋的保护措施,例如: 切换到同步IO以将数据写入磁盘(对于服务器响应的原因,实际上并不想这么做)。 设置一个标志,当我开始写数据,并没有logging任何新的数据,而该标志设置(导致我在写入过程中丢失的数据logging)。 选项2更复杂的版本,我设置标志和设置标志时,新的数据进入一个单独的临时数据结构,当文件IO完成,然后合并真实的数据(可行,但似乎丑陋)。 拍摄原始数据的快照副本,并花时间将该副本写入磁盘,知道没有人会修改副本。 我不想这样做,因为数据集是相当大的,我在有限的内存环境(树莓派)。 所以,我的问题是当asynchronousIO的其他操作可能需要修改该数据时用什么devise模式来编写一个大的数据集? 处理我的问题的方法是否比上面列出的具体解决方法更多?