Articles of 诺言

Promise findOneAsync variable = {“isFulfilled”:false,“isRejected”:false}?

使用蓝鸟Promisfymongoose,我有一个Promise.map(函数与一系列if / else循环通过一个数组,以查看引用文档是否存在,否则创build一个.. 将findOneAsync的产品分配给一个variables,然后将“variable._id”分配给制作中的新文档(主承诺),控制台日志{"isFulfilled":false,"isRejected":false} 这是一个片段: for (i=0; i<items.length; i++) { var existingItem = Models.Items.findOneAsync({ item: items[i] }); console.log( "existingItem : "); console.log( JSON.stringify(existingItem) ); console.log( "existingItem._id : " + existingItem._id ); 这是一个日志: existingItem : {"isFulfilled":false,"isRejected":false} existingItem._id : undefined 为什么可能为Model.Item.findOneAsync挂起existingItemvariables?

是否仍然有必要提供MongoDB驱动程序?

这个问题的答案仍然是相关的: 我怎样才能使用蓝鸟promisify MongoDB原生的Javascript驱动程序? 我不知道从什么时候这是更新,但2.0的MongoDB的JS驱动程序在选项对象promiseLibrary有一个属性: http : promiseLibrary 大多数方法/函数都会返回一个promise,比如Cursor.toArray() 。 但是,我找不到使用这个新选项的例子,但是使用这个方法并不简单: MongoClient.connect('mongodb://URL', { promiseLibrary: require('bluebird') }); 或者这个定义是错误的? – 在这种情况下,应该如何正确定义? 更新: 代码在io.js上运行,所以我可能甚至不需要指定一个promiseLibrary作为驱动程序将使用ES6承诺? 然而,据说蓝鸟的承诺是较慢的: 为什么本机ES6承诺比bluebird更慢,更占用内存? Update2:我已经添加了蓝鸟标签 – 也许蓝鸟工作的人可以提供更多的细节,如果promisifying真的比使用MongoDB自己的实现更好?

如何使用promise在Javascript中发生exception后重试?

我正在使用蓝鸟承诺库。 我有一系列如下的promisified函数: receiveMessageAsync(params) .then(function(data)) { return [data, handleMessageAsync(request)]; }) .spread(function(data, response) { return [response, deleteMessageAsync(request)]; }) .spread(function(response, data) { return sendResponseAsync(response); }) .then(function(data) { return waitForMessage(data); }) .catch (function(err) { // handle error here }); 偶尔sendMessage将会失败,因为我们假设服务器不能响应。 我希望代码能够一直试图回应,直到成功。 你不能简单地把sendMessage包装到一个catch中,因为它实际上并没有抛出一个exception,我想,它调用了“错误”函数,在这个promisified代码中是底部的“catch”。 所以必须有一些方法来在“catch”部分“重试”发送消息。 问题是,即使我在“catch”的循环中重试,我仍然没有办法跳到promise链并执行剩下的promisified函数。 我如何处理这个? 编辑: 我重试了一个HTTPpost,结果如下所示: function retry(func) { return func() .spread(function(httpResponse) { if (httpResponse.statusCode != 200) { […]

如何在node.js中使用express来使用Promise?

我使用Express来使用Promise。 router.post('/Registration', function(req, res) { var Promise = require('promise'); var errorsArr = []; function username() { console.log("agyaaa"); return new Promise(function(resolve, reject) { User.findOne({ username: req.body.username }, function(err, user) { if(err) { reject(err) } else { console.log("yaha b agyaaa"); errorsArr.push({ msg: "Username already been taken." }); resolve(errorsArr); } }); }); } var username = username(); console.log(errorsArr); […]

如何在节点中debugging基于承诺的代码?

我使用Cujo伟大的库当我的Node项目提供Promises / A +实现,虽然这个问题不是特定于节点的。 一般来说,什么时候是好的,它可以让我编写更易于维护的代码。 但是,当我的callback意外失败(访问一个nullvariables的属性等)时,这些exception被有效地吞噬了,这似乎是由Promises / A +规范指定的。 不幸的是,这意味着我没有得到任何关于错误的反馈 (除了在那一刻执行的callback停止)。 没有错误types或消息,没有行号。 为了显示: // hypothetical asynchronous database query database.query(queryDetails).then(function(result) { var silly = 3.141592654; silly(); // TypeError: number is not a function! process(result); // this code is silently never executed }); 我可以想到一些(不可接受的)方法来解决这个问题: 为每次调用提供失败callback(将原因/exception转储到控制台) 将所有callback机构包装在试用版中 乱丢“地标日志”的代码库ala console.log('I got here 123') 我只是做错了吗? 当然,我并不是唯一一个发现基于promise的代码差的可debugging性。 有没有一个明显的解决scheme,我错过了?

parsing云代码“第一个”查询数组返回不同的结果

我有一个简单的查询如下: var getGreaterQuestion = function (gid) { var query = new Parse.Query(Parse.Object.extend("Question")); query.equalTo("groupId", gid); return query.first(); } 我正在准备一个由这个函数组成的数组: var groupIds = _.range(1, 17); var groupIdAndRandomNumberPack = _.map(groupIds, function (gid) { return {groupId: gid, random: Math.random()}; }); var pack = _.map(groupIdAndRandomNumberPack, function (queryItem) { return getGreaterQuestion(queryItem.groupId, queryItem.random); }); 在pack数组中, Question类有16个不同的“第一”查询。 我正在使用下面的代码片段运行此查询: return Parse.Promise.when(pack).then(function () { console.log("arguments […]

Mongodb节点驱动2.0。*与Bluebird 2.9。* promisification

所以围绕这个主题还有一些其他的疑问,比如: 我怎样才能使用蓝鸟提供MongoDB本地的Javascript驱动? 然而,它似乎并没有解决最新版本的驱动程序,这似乎有问题,当试图promisify时。 目前我可以通过执行MongoClient工作: Promise.promisifyAll(mongodb.MongoClient); // Using .Prototype here fails to promisify 然而,无论我尝试着什么,Collections似乎都不会使用*async调用操作,它可能会调用它们,但是它们永远不会被解决或被拒绝,所以它们只能被挂起。 历史上在以前的版本,你只会Promise.promisifyAll(mongodb) ,你已经完成了,但我不确定如何正确处理这个新的驱动程序。 下面是一个使用mongo direct promisification connectAsync创build的集合的示例输出,然后从返回的数据库获取集合。 一旦我尝试在集合上做任何事情,它只是挂起,承诺不会从它回来: { s: { pkFactory: { [Function: ObjectID] index: 14727641, createPk: [Function: createPk], createFromTime: [Function: createFromTime], createFromHexString: [Function: createFromHexString], isValid: [Function: isValid], ObjectID: [Circular], ObjectId: [Circular], createPkAsync: [Object], createFromTimeAsync: [Object], createFromHexStringAsync: [Object], isValidAsync: [Object], bindAsync: [Object], […]

Mongoose with Bluebird promisifyAll – 对模型对象的saveAsync结果作为已解决的承诺值

我用蓝猫的promisifyAll与mongoose。 当我在模型对象上调用saveAsync(保存的promisified版本)时,完成的promise的parsing值是一个包含两个元素的数组。 第一个是我保存的模型对象,第二个是整数1 。 不知道这里发生了什么事。 下面是重现问题的示例代码。 var mongoose = require("mongoose"); var Promise = require("bluebird"); Promise.promisifyAll(mongoose); var PersonSchema = mongoose.Schema({ 'name': String }); var Person = mongoose.model('Person', PersonSchema); mongoose.connect('mongodb://localhost/testmongoose'); var person = new Person({ name: "Joe Smith "}); person.saveAsync() .then(function(savedPerson) { //savedPerson will be an array. //The first element is the saved instance of person //The […]

使用node.js进行Javascriptasynchronousexception处理

我目前正在研究一个node.js应用程序,我有通常的asynchronous代码问题。 我正在Node的HTTP模块上实现一个服务服务器。 这个服务器支持(表示)路线。 例如,我有这样的代码: server.any("/someRoute",function(req,resp){ resp.end("this text is sent to clients via http") }); 服务器需要能够承受失败,当传递给任何一个函数有问题时,我不想让整个服务器崩溃。 当我写代码看起来像这样的问题发生: server.any("/someRoute",function(req,resp){ setTimeout(function(){ throw new Error("This won't get caught"); },100); }); 我不明白我怎么可能在这里发现错误。 我不想通过一个服务器端故障使服务器崩溃,而是想要服务500。 我能想出的唯一解决scheme实际上并不具有performance力。 我只想出了使用process.on("uncaughtException",callback)和类似的代码使用节点0.8 Domains (这是一个部分的补救措施,但领域是目前越野车,这仍然不是很有performance力,因为我最终不得不创造每个句柄的一个域)。 我想完成的是throw一个函数的throw动作绑定到一个作用域,理想的解决scheme就像将所有抛出的错误从一个函数绑定到一个特定的处理函数一样。 这可能吗? 在这种情况下处理错误的最佳做法是什么? 我想强调的是,它应该能够继续服务请求后,不良请求,并重新启动服务器的每个请求或创build域的每个处理程序和捕获他们的未捕获的exception对我来说似乎是一个坏主意。 另外 – 我听到承诺可能会帮助我(有关兑现承诺的事情),可以承诺在这种情况下援助我吗?

我如何处理承诺的错误?

作为节点程序员。 我习惯于使用“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, […]