Articles of 诺言

承诺的节点骑士

我正在尝试使用骑士的评估function。 一个简单的例子: var Horseman = require('node-horseman'); var horseman = new Horseman(); horseman .open('http://google.com') .evaluate(function() { var promise = new Promise(function(resolve,reject){ setTimeout(function(){resolve("Hello")},2000); }); return promise; }) .then(function(mesg){ console.log(mesg); }) .close(); 我期待解决的价值“你好”被传递到下一个函数作为mesg参数当承诺履行,但相反,我得到以下错误: Unhandled rejection fn evaluate global code evaluateJavaScript@[native code] evaluate@phantomjs://platform/webpage.js:390:39 我错过了什么吗?

如何捕捉蓝鸟ENOENT?

因为fs.exists的弃用,我喜欢用蓝鸟捕捉ENOENT。 举个例子: .then(() => { return promisedFs.unlinkAsync(excelPath); }) .catch(ENOENT ERROR, () => { //do something }) .catch(all other errors, () => {//do something})

蓝鸟承诺与callback发电机

我如何让蓝鸟自动将.nodeify / .asCallback添加到生成的承诺? 在bluebird中,任何promise实例都可以附加到节点callback机制上: Promise.resolve('foo').asCallback(callback); 然而,有时可能不需要定义承诺本身,而是一种被调用的方法,每次都会返回一个新的承诺,如下所示: // create a new random number promise each time Promise.method((foo, callback) => Math.random()); // create a new random number promise each time using a generator Promise.coroutine(function *(foo, callback) { return Math.random(); }); 在这种情况下,如果我想附加一个callback处理程序的承诺,我不得不这样做“人为地”在最后,使用像这样一个临时的方法: // create a new random number promise each time using a generator Promise.coroutine(function *(foo, callback) { […]

节点JS – 处理多个查询(承诺,蓝鸟)

我很好,如果新的Node JS(我使用MongoDB,Express和Mongoose),我有以下问题: 有一个包含10个地址标识的数组,我需要在做其他事情之前检查所有地址是否在数据库中。 我知道mongoose使asynchronous查询,我试图使用蓝鸟( https://www.npmjs.com/package/bluebird )作出承诺,但仍然没有运气: 这里有一些尝试: 1 var checkIds = function(idsArray){ return new Promise(function(resolve, reject){ var result = undefined; idsArray.forEach(function(id){ Address.count({_id: id}, function(err, count){ //count is 0 if id does not exist if(err || !count){ reject(false); } }); resolve(true); }); } } 第2 var checkIds = function(idsArray){ return new Promise(function(resolve, reject){ var result = […]

承诺改变for循环的全局variables

我正在尝试做一些JavaScript代码的不同风格的基准testing,这里是我有: var Promise = require('bluebird'); var timer = function(name) { var start = new Date(); return { stop: function() { var end = new Date(); var time = end.getTime() – start.getTime(); console.log('Function:', name, 'finished in', time, 'ms'); } }; }; function regular (a, cb) { if (a % 2 === 0) return cb(null, a); return […]

如何确认更新是否成功使用mongoose和蓝鸟的承诺

我正在使用bluebird和mongoose作为节点页面。 我想检查更新是否成功,然后通过socket.js发送数据到客户端。这里是我无法弄清楚的代码部分: .then(function(a) { var g = collection3.update({ _id: a.one[0]._id }, { $set: { avg: a.one[0].avg } }).function(err, d) { if (!err) { return 1; // Here's the problem } }) return { updated: g, info: a }; }).then(function(c) { console.log(c.updated); // I can't get the `1` value if (c == 1) { io.sockets.in('index|1').emit("estimate", c.three); […]

为什么在callback函数setInterval中取消蓝鸟承诺?

Promise = require 'bluebird' cb = -> console.log 'callback!' p = Promise.resolve(5) .cancellable() .tap -> p.cancel() setInterval(cb, 100) cb函数只能被调用一次。 注释.tap -> p.cancel()允许它重复运行。 添加一个try块没有帮助。 也许这是显而易见的,但我做了一些研究,找不到解释。

Node.js Promise没有按顺序执行

在我启动Web服务器之前,我想为configuration文件创build一些本地目录,而不是 // app.js var fsPromise = require('./fs-promise.js'); var httpPromise = require('./http-promise.js'); var promise = require('promise'); promise.all([fsPromise.createDir('configs'), fsPromise.createDir('logs')]) .then(httpPromise.startServer()); // fs-promise.js var fs = require('fs'); var promise = require('promise'); module.exports = { … createDir: function(directory) { return new promise(function(fulfill, reject) { //console.log('Creating new dir: ' + directory); var newDir = __dirname + "\\" + directory; fs.mkdir(newDir, […]

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 […]

(蓝鸟)中的咕噜声无声错误?

我有一个以main()函数为起点的npm模块。 现在,让我们说我在这个main()抛出一个Error,如下所示: function main() { throw new Error("An error!"); } 然后用node my-app-that-launchers-main.js执行它,然后显然,错误被抛出,我得到一个node my-app-that-launchers-main.js 。 如果我为此写一个咕噜的任务: var mynpm = require("mynpm"); module.exports = function(grunt) { grunt.registerTask("build",function() { mynpm.build(); }); } 并通过Grunt执行它,然后失败。 如预期的那样,错误被抛出,咕噜声失败。 不过,如果我把这个扔在蓝鸟的承诺里面: function main() { Promise.try(function(resolve) { throw new Error("An error!"); } ).catch(function() { console.log("error"); } ).finally(function() { console.log("finally"); }); } 并通过node运行,然后我看到catch函数被调用。 正如所料。 但是,如果我通过Grunt的registertask运行相同的代码,一切都变得沉默。 也不是finally的结果。 什么可能造成这一点。 […]