Articles of q

Q.js:如何重写Q.js中的asynchronous系列stream?

为了掌握Q.js ,我想在Q.js使用async.series来转换下面的代码。 基本上我创build一个文件夹,如果它不存在(使用mkdirp),将文件移动到备份文件夹,并将文件保存到主文件夹。 var async = require('async'); var fs = require('fs'); var path = require('path'); var sessiondId = new Date().getTime() % 2 == 0 ? new Date().getTime().toString() : '_1234'; var backupFolder = path.join(__dirname,sessiondId); var backupFullPath = path.join(backupFolder,'a.txt'); var fullPath = path.join(__dirname,'main','a.txt'); var mkdirp = require('mkdirp'); async.series({ createOrSkip: function(callback) { mkdirp(backupFolder, function (err, dir) { if(err) […]

包裹在承诺的JavaScript通用函数

如何将可以同步/同步function的函数封装在promise中? 我已经打电话给如下function action[fn](req, res); 在函数fn(在下面的例子中)可以在里面(我使用dynamic调用每个函数)同步或者像下面那样的同步, 它如何推荐包装在承诺。 如何处理错误,如果有… 我使用nodeJS应用程序 run: function (req, res, filePath) { var writeStream = fs.createWriteStream(fileRelPath, {flags: 'w'}); req.pipe(writeStream); req.on("end", function () { console.log("Finish to update data file") }); res.end("File " + filePath + " saved successfully"); }

链式顺序任务

我有3个任务要处理,当完成这3个任务时,我想要执行以下操作: 将这三个文件一起对待 丑化 写入磁盘 随着Grunt我有一个漫长的过程,所有这一切。 这是我用Gulp尝试过的 gulp.task('libs', function () { return gulp.src('js/libs/*.js') .pipe(concat('01.libs.js', {newLine: ';'})) .pipe(gulp.dest('min')); }); gulp.task('plugins', function () { return gulp.src('js/plugins/*.js') .pipe(concat('02.plugins.js', {newLine: ';'})) .pipe(gulp.dest('min')); }); gulp.task('apps', function () { return gulp.src('js/apps/**/*.js') .pipe(concat('03.apps.js', {newLine: ';'})) .pipe(gulp.dest('min')); }); gulp.task('scripts', ['libs', 'plugins', 'apps'], function () { return gulp .src('min/*.js') .pipe(concat('testFile.js', {newLine: ';\r\n'})) .pipe(rename({suffix: '.min.v' + […]

在执行callback时,在Node.js中打破Q承诺?

请以承诺为理由,请原谅我的新手。 我在Node.js中使用Q模块 我有一个函数,一旦执行了所有必要的步骤,就会调用callback函数。 当我想从Q promise中调用callback函数时就会出现问题。 我希望的function是能够在达到最后一步时调用callback函数,而不再是承诺链中。 因此,callback将恢复到原来的操作状态。 但是,正如我编写的那样,callback在promise的上下文中被调用。 在这一点上,如果callback(比如说)抛出一个错误,它会被这个函数中的error handling程序捕获,这不是我想要的! var updateDataStream = function(data, input, posts, stream, callback) { // Pack all the items up… Q.ncall(data._packStream, data, posts, stream) // Upsert the cache into the database .then(function(){ return Q.ncall(data.upsert, data); }) // buffer the new input .then(function(res){ return Q.ncall(data.buffer, data, input); }) .then(function(final){ callback(null, final); […]

mongoose和Q承诺

我正在从这里的mongoose / q promises框架样例开始工作 ,但在尝试使用findOne时似乎遇到了nfbind的一些问题,主要是因为Q框架中的样本似乎不符合要点。 我的代码: var mongoose = require('mongoose'); var Q = require('q'); var user_schema = mongoose.Schema({username:String, last_touched:Date, app_ids:[String]}); var user = mongoose.model('user', user_schema); exports.user = user; exports.user.find = Q.nfbind(user.find); exports.user.findOne = Q.nfbind(user.findOne); 如果我调用user.findOne({username:'test'}).then(function(err, user) { … } ,用户总是未定义。如果我删除导出并使用callback的非诺言版本,我得到了用户,我错过了一些特殊的魔法,但是在看了代码实现之后,来自Q github和mongoose演示的例子…没有什么真正跳出来的。用Q做一个findOne工作? 我也尝试在源代码中而不是在模块中设置nfbind函数,但无济于事。

q.js:我可以停止执行一个函数,直到履行一个承诺吗?

举个例子: if(foo) { async_call(); // returns a Q promise object } // do this immediately if foo was false // or after the promise is resolved if foo was true 这甚至有可能吗? 我可以看到的替代scheme要么总是调用asynchronous函数,抛出'foo'检查,这是不太理想的,但将工作在代码中; 或者假设'foo'是真的,如果它是假的,则抛出一个错误(要求调用者在调用asynchronous函数本身之后再次尝试),这对于显而易见的原因来说更不理想。 编辑:作为一个临时的工作,我发现这个作品,但它并不理想: var promise = foo ? Q.defer().resolve(foo).promise : async_call(); promise.then(function(foo) { // this is done after the async call if it was […]

如何处理循环中的承诺?

这是我想要做的 var response = []; Model.find().then(function(results){ for(r in results){ MyService.getAnotherModel(results[r]).then(function(magic){ response.push(magic); }); } }); //when finished res.send(response, 200); 但是它只返回[],因为asynchronous的东西还没有准备好。 我正在使用使用Q promise的sails.js。 任何想法如何在所有asynchronous调用完成时返回响应? https://github.com/balderdashy/waterline#query-methods(promise方法)

Promises:是.done()总是执行,即使.catch()是?

我的承诺问题 我是Promises新手,我一直在阅读Q文档 ,它说: 当你到达一个承诺链的末尾,你应该返回最后的承诺或结束链。 我已经在我的代码中定义了一个Promise Q.Promise方法,使用以下console.log来注销一个执行跟踪: function foo(){ return Q.Promise(function(resolve, reject) { doSomething() .then(function() { console.log('1'); return doSomething1(); }) .then(function() { console.log('2'); return doSomething2(); }) .then(function() { console.log('3'); return doSomething3(); }) .catch(function(err) { console.log('catch!!'); reject(err); }) .done(function() { console.log('done!!'); resolve(); }); }); } 如果每个doSomethingN()正确执行,一切都按预期工作,我得到预期的轨迹: 1 2 3 done!! 但是 ,如果任何doSomethingN()失败: foo()可以正常工作,因为错误函数callback是发生reject(err)时运行的错误函数。 foo().then(function() { /* */ […]

“Q.when”的蓝鸟相当于什么?

从Q切换到Bluebird ,我只是想确保它在文化上是正确的:是否有一个相当于Q.when(someValue); 或Q(someValue); ? 它是Promise.resolve(someValue); ?

在Q中链接任意数量的承诺

我想发送一个HTTP请求N次。 我想最终得到关于每个请求的结果的信息。 运行请求function一次很好。 以下是使用Q.defer()的HTTP请求函数: function runRequest() { var deferred = Q.defer(), start = (new Date).getTime(), req = HTTP.request(options, function(res) { var end = (new Date).getTime(), requestDetails = { reqStatus: res.statusCode, reqStart: start, reqEnd: end, duration: end – start } deferred.resolve(requestDetails); }); req.on('error', function(e) { deferred.reject(e.message); }); req.end(); return deferred.promise; } 如果我这样做,我收回我期望的数据: runRequest().then(function(requestDetails) { console.log('STATUS: ' […]