Articles of 承诺

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

我试图在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模式来编写一个大的数据集? 处理我的问题的方法是否比上面列出的具体解决方法更多?

承诺待定

我的代码: let AuthUser = data => { return google.login(data.username, data.password).then(token => { return token } ) } 而当我尝试运行这样的东西: let userToken = AuthUser(data) console.log(userToken) 我越来越: Promise { <pending> } 但为什么? 我的主要目标是将google.login(data.username, data.password)令牌返回给一个variables。 只有这样才能做出一些行动。

使用promise来处理node.js中的MySQL返回值

我有一个python背景,目前正在迁移到node.js. 由于其asynchronous性质,我有调整到node.js的问题。 例如,我试图从MySQL函数返回一个值。 function getLastRecord(name) { var connection = getMySQL_connection(); var query_str = "SELECT name, " + "FROM records " + "WHERE (name = ?) " + "LIMIT 1 "; var query_var = [name]; var query = connection.query(query_str, query_var, function (err, rows, fields) { //if (err) throw err; if (err) { //throw err; console.log(err); logger.info(err); […]