Tag: promise

什么是明确的承诺build设反模式,我如何避免它?

我正在编写的代码看起来像这样: function getStuffDone(param) { | function getStuffDone(param) { var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) { // or = new $.Deferred() etc. | // using a promise constructor myPromiseFn(param+1) | myPromiseFn(param+1) .then(function(val) { /* or .done */ | .then(function(val) { d.resolve(val); | resolve(val); }).catch(function(err) { /* .fail */ | […]

使用Q承诺 – 有没有办法让这个代码重复性较低?

我正在为我的Node.js应用程序启动一个集成testing套件。 我目前正在尝试编写一个设置脚本来擦除testing数据库,并用一些testing数据填充它。 我试图避免可怕的“厄运金字塔” ,我希望使用承诺作为防止我的代码失控的一种方式。 我对承诺很陌生,我仍然试图把自己的头围绕在他们身上 – 可能我没有正确使用它们。 这是我没有承诺的最初版本。 这工作,但嵌套callback了wazoo: var mongoose = require('mongoose'); var User = require('./user'); var MONGODB_URL = process.env.MONGODB_TEST_URL || 'localhost:27017/swot_test'; console.log('\nRunning e2e test preparation script'); console.log('———————————–\n'); console.log('Connecting to database:', MONGODB_URL, '…') mongoose.connect(MONGODB_URL, function () { console.log('Wiping database…') mongoose.connection.db.dropDatabase(function () { console.log('Setting up test user…') User.createUser({ email: 'test@example.com', password: 'tester' }, function (err, […]

Node.js承诺Q.all不起作用

我有这个readLines函数来逐行parsing,调用从: var fs = require('fs'); var Q = require('q'); Q.all(readLines(fs.createReadStream("/tmp/test.txt"), console.log)).then(function () { console.log('Done'); }; function readLines(input, func) { var remaining = ''; input.on('data', function (data) { remaining += data; var index = remaining.indexOf('\n'); while (index > -1) { var line = remaining.substring(0, index); remaining = remaining.substring(index + 1); func(line); index = remaining.indexOf('\n'); } }); […]

许多排队操作的Q模式

我正在为node.js编写一个小脚本,从文件中读取一堆图像名称(2.5k),调整图像大小并将其输出到目录。 我天真的方式导致用完文件句柄: //get the list of images, one per line in the file var imgs = file.split('\n'); //keep track of how many images we've processed var done = imgs.length; var deferred = Q.defer(); for (var i = 0; i < imgs.length; i++) { (function resizeImg(img) { //open the file for writing the resized image to […]

Q诺从未引用过

Kris Kowal的Q文档指出, Q.onerror是在未处理的exception时调用的。 我不能使它工作: var Q = require('q'); Q.longStackSupport = true; var util = require('util'); Q.onerror=function(){ console.log('Q.onerror::') console.log(util.inspect(arguments)) } function get(){ var def=Q.defer(); def.resolve('resolved'); return def.promise; } get() .then(function(val){ console.log('ok:'+val) undefined._prop; // i would expect this exception to be // forwarded to Q.onerror… but it doesn't console.log('not reachd') }); 输出: ok:resolved 我想我不太了解Q.onerror的使用我想跟踪一个不错的堆栈跟踪未处理的exception(也可能是拒绝)

我怎样才能得到JavaScript服务事件队列在节点

我有一个函数,需要等到一个承诺解决之前返回一个值。 不幸的是,简单地使用一个while循环,并检查是否解决承诺霸占线程,不会让我的setTimeout函数执行它的callback。 我能想到的唯一解决scheme是告诉js服务事件队列,如果我的d.promise还没有被parsing为true。 贝娄是我的代码: var _ = require('lodash'); var Q = require('q'); var h = function(x,y,z, callback) { setTimeout(function(){ // This never logs to my terminal console.log(x + y + z); callback(); }, 1000); }; var b = function(x,y,z, callback) { console.log(x * y * z); callback(); }; chain = function(args, f) { var index; […]

从Q.all压缩结果的最佳方式

并行(Q.all)承诺压缩结果的最佳方式是什么? 只是 .spread(function(result1, result2) {return _.zip(result1, result2);}) 什么更好?

有人可以为我解释下面的代码吗?

我正在努力去理解诺言。 但在这里我很困惑。 我想创build一个3秒钟后打印3000的testing函数,2秒后打印2000,1秒后打印1000。 这是我的代码: 'use strict'; var Q = require('q'); function delayConsole(timeOut) { var defer = Q.defer(); setTimeout(function(){ console.log(timeOut); defer.resolve(2000); },timeOut); return defer.promise; } // This works delayConsole(3000).then(function(){ return delayConsole(2000); }).then(function(){ return delayConsole(1000); }); // This doesn't work. Why? delayConsole(3000).then(delayConsole(2000)).then(delayConsole(1000));

Q承诺:如何顺序尝试多个registry

我可能需要一些关于node.js应用程序的Q promise的帮助。 我的用例如下: 我们需要find(通过ID)一些信息(说一个命令) 我们有多个存储库可能包含的信息(目录,数据库,nosql,REST服务…) 我们有一个search序列。 也就是说,我们不希望以平行和最快的速度search所有的数据,但是我们需要依次search一个数据库 find信息后,我们可以停止search并忽略剩余的存储库 我们已经对每个存储库都有承诺 我正在努力的是创造/返回一个承诺,完成时,信息被发现。 像(伪代码): var deferred = Q.defer(id) foreach repo in repositories { var p = repo.findById(id) .then deferred.resolve(order) p.waitForThePromiseToFinish if (p.success) break } 一个想法如何实现这一点? 任何帮助表示赞赏。

了解节点stream和vinyl-fs

我有一个奇怪的问题,我不知道我的问题在哪里。 可能是因为我缺乏对节点stream或乙烯fs基础知识的理解。 无论如何,这里是描述: 我正在构build不同的脚本,我想用吞咽。 比如,这个正在build设一些我需要的资产。 更确切地说,我正在将引导源文件从node_modules复制到我的资产文件夹。 这个函数应该返回一个promise,这样我就可以更容易地用它来使用它。 这是sass-bootstrap.js文件,它将完成这项工作: 这是一个较短的版本,之前有一些检查,但与我的问题没有关系。 假定所有的variables定义。 var defer = Q.defer(), vinylFs = require( 'vinyl-fs' ), map = require( 'map-stream' ); function sass_bootstrap() { var defer = Q.defer(); vinylFs.src( [ bootstrap_sass_route + '/**/_*.scss' ] ) .pipe( vinylFs.dest( assets_sass_bootstrap ) ) .pipe( map( function( file, cb ) { cb( null, file ); })) […]