Articles of 承诺

超时在asynchronous/等待

我与Node.js和TypeScript,我正在使用async/await 。 这是我的testing用例: async function doSomethingInSeries() { const res1 = await callApi(); const res2 = await persistInDB(res1); const res3 = await doHeavyComputation(res1); return 'simle'; } 我想为整体function设置一个超时时间。 即如果res1需要2秒, res2需要0.5秒, res3需要5秒我想有一个超时,3秒后,让我抛出一个错误。 使用正常的setTimeout调用是一个问题,因为范围已经丢失: async function doSomethingInSeries() { const timerId = setTimeout(function() { throw new Error('timeout'); }); const res1 = await callApi(); const res2 = await persistInDB(res1); const res3 […]

何时拒绝/解决承诺

我在想什么时候我需要拒绝承诺。 我发现了几个关于这个话题的问题,但是找不到合适的答案。 我应该什么时候拒绝承诺? 这篇文章http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises说: 解决:一个成功的Promise被“解决”,它调用正在等待的成功侦听器,并记住为未来成功侦听器parsing的值。 分辨率与返回的值相关。 拒绝:遇到错误情况时,Promise被拒绝,它调用正在等待的错误侦听器,并记住被连接的未来错误侦听器拒绝的值。 拒绝与抛出的exception相关。 这是原则指引吗? 那只有在发生exception时才拒绝承诺? 但是在遇到类似的function的情况下 findUserByEmail() 我会希望该函数返回一个用户,以便我可以继续链而不validation结果 findUserByEmail() .then(sendWelcomeBackEmail) .then(doSomeNiceStuff) .then(etc..) 什么是最好的/常见的做法?

在Node.js上,Q延迟是如此之慢?

所以我在Node.js中创build了这个简单的testing服务器 每当我做出直接的回应,我就会得到2200个请求/秒(快!)。 当我只包装一个简单的Q时,它会下降到580个请求/秒( 慢4倍 !)。 有人可以解释这个巨大的差异吗? // Requires var server = require('http'); var q = require('q'); // Start server var http = require('http'); http.createServer(function(request, response) { // Comment out either of two below sections // Without deferred // 2200 reqs/second response.writeHead(200, {"Content-Type": "text/html"}); response.write("test"); response.end(); // Q deferred // 580 reqs/second var deferred = q.defer(); […]

我如何使用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; […]