Articles of 承诺

bluebird .all()不会调用

我有一个未知数量的asynchronous进程可能从请求运行。 有一个文本块被这些进程修改。 调用UpdateScript是要修改的文本,它有一个callback,我想运行时,一切都完成。 var promise = require('bluebird'); function updateScript(text, cb){ var funcChain = [], re = some_Regular_Expression, mods = {text: text}; while (m = re.exec(mods.text)) { // The text is searched for keywords. If found a subprocess will fire …. funcChain.push( changeTitleAsync(keyword, mods) ); } promise.all(funcChain) .then(function(){ // This is never called. cb(mods.text); }); } […]

Node.js node-gcloud同步调用

我使用node-gcloud https://github.com/GoogleCloudPlatform/gcloud-node与Google云端存储进行交互。 我正在开发一个node.js服务器(我的第一个node.js项目),为客户提供一小组API。 基本上,当用户上传文件时,API调用会返回签名的url来显示该文件。 getSignedUrl函数是asynchronous的https://googlecloudplatform.github.io/gcloud-node/#/docs/v0.8.1/storage?method=getSignedUrl ,我找不到从另一个函数返回结果的方法。 我已经开始玩蓝鸟的承诺,但是我不能明白。 这是我的代码: var _signedUrl = function(bucket,url,options) { new Promise(function (resolve, reject) { var signed_url bucket.getSignedUrl(options, function(err, url) { signed_url = err || url; console.log("This is defined: " + signed_url) return signed_url }) }) } var _getSignedUrl = function(url) { new Promise(function(resolve) { var options = config.gs , expires = […]

当child_process成功处理信号时callback

我需要validation一个child_process已经成功地被杀死,因为如果这个进程仍然存在,我不能执行下一个操作。 var proc = require('child_process'); var prog = proc.spawn('myprog', ['–option', 'value']); prog.on('data', function(data) { // Do something }); 在代码的其他地方,我达到了某个事件,并在一定的条件下,我需要杀死prog : prog.kill('SUGHUP'); // Only when the process has successfully been killed execute next // Code… 由于kill可能是asynchronous的,我正在使用q 。 我想在kill上使用q ,但kill在处理完信号后没有执行callback。 怎么做? 可能的想法 如果我发送一条消息来处理prog并在接收到消息的过程prog我杀了它? 如何能告诉一个过程自杀?

错误:超过2000毫秒超时。 unit testing承诺

我的unit testing向HTTP API请求HTTP请求并使用kriskowal q库。 当我assert调用, thencallback和断言失败,我看到Error: timeout of 2000ms exceeded而不是AssertionError 。 我写了一个例子来说明这种情况: var assert = require('assert') , Q = require('q'); it('promise', function(cb){ var deferred = Q.defer(); deferred.promise.then(function(){ assert(false); cb(); }); deferred.resolve(); }); 我无法理解这种行为。 使用setTimeout/setImmediatebuild模asynchronous行为显示正常的AssertionError 。

Node.js Q ninvoke多个参数

如何将多个parameter passing给Q ninvoke? 例如: exports.getBalance = function () { return Q.ninvoke(library, 'method', **[Arguments]**); } 目前我有 return Q.ninvoke(library, 'method', '*', 6); 凡参数是一个数组或参数列表? 我想重复使用我的ninvoke调用,但有时方法需要一个或多个参数。 谢谢。 理查德。

在蓝鸟中顺序运行asynchronous函数?

如果使用蓝鸟,我怎么能顺序地运行任务? 我有一个任务列表,每个任务都取决于以前的任务的结果,但任务可能是一个asynchronous的工作。 以下代码是不行的,我应该使用promise.all还是其他函数? “那么”链让我感到困惑,f2直接运行,而不是等待f1完成(我也不知道如何“解决”f1) var Promise = require("bluebird"); function f1(p1){ console.log("init value or f2 return:"+p1); var p = Promise.resolve(); setTimeout(function(){ var r = "aysnc result"; // how can i notify next step when a async operation done? // there is no p.resolve function },1000) return p; } function f2(p1){ console.log("f1 said:"+p1); return "f2 result"; } […]

蓝鸟未处理发出NodeJS的错误

即时通讯使用蓝鸟v2.8.2承诺,但即时获取未处理的错误和捕获代码不处理。 编辑来响应: var Promise = require('bluebird') util = require('util') EventEmitter = require('events').EventEmitter; var Module = function() { EventEmitter.call(this); }; util.inherits(Module, EventEmitter); var getData = function() { return Promise.reject(new Error('test')); }; Module.prototype.getCustomer = function() { var self = this; setTimeout(function() { getData().then(function() {}) .catch(function(error) { self.emit('error', error); // This causes problem!! }); }, 1000); } 解决: […]

如何避免在使用q.map时破坏承诺链?

我想我可能已经过于乐观了。 我有一堆鹅,在返回最终值之前,我想要执行任意数量的操作。 我发现,在第一个回报声明之后,链条被打破了。 如果我的集合有10个项目,那么将有10个项目被放置在数据库中,但是当我尝试从下面的“return Q.all(promises)”语句构buildAPI响应时,我会得到空值。 为了testing,我已经把一个console.log语句放在一个承诺之后,在我的expressjs路由里面的第一个和一个console.log之后触发,它期待着鹅的细节。 API响应总是首先完成“[null,null]”,然后最终获得链中第二个和第三个promise的条目。 我是如何创造这种竞争条件的,我该如何解决? var promises = geese.map(function(goose) { determineGooseType(goose.details) .then(function(type) { return recordNewGooseType(type) }) .then(function(dbInsertResult) { we never really got here! }) .catch(function(err) { log some stuff }); } return Q.all(promises);

链接超时导致上次超时被拒绝?

我目前正试图用超时链接一些承诺,不pipe超时是什么,总是报告最后一个。 我用bluebird和Q做了相同的结果,所以我觉得我有一个普遍的问题。 代码基本如下所示: var Promise = require('bluebird'); Promise.delay(2000) .then(function() { return Promise.delay(2000); }) .timeout(1000, 'Timeout 1') .then(function() { return Promise.delay(500); }) .timeout(1000, 'Timeout 2') .then(function() { return Promise.delay(500); }) .timeout(1000, 'Timeout 3'); 我得到“未处理的拒绝超时错误:超时3”。 我想要的是超时1.我尝试每次超时后捕捉,但我也一样。 有没有办法让它工作,而不完全分裂?

将嵌套的'for'循环转换为Promise,Promise? 嵌套承诺?

我有一个数组,其中的值是由“/”分隔的序列,以及一个“ mapSeries ”Promise(用于连续迭代映射的辅助函数),循环遍历每个序列中的每个值。 现在,声明开始于一个嵌套的“for”循环,它将一个序列分割成若干个string,然后将这些值传递给一个空的数组,以交给“mapSeries”的承诺。 经过testing,事实certificate,这只适用于原始数组有一个序列,因为多个序列并行运行。 这怎么能被写成一个承诺,对每个序列连续运行,然后连续地为给定序列中的每个元素? 这里是for循环的尝试(适用于单个序列): var sequences = ['one/two/three', 'alpha/beta']; var elements = []; for (i=0; i<sequences.length; i++) { var series = sequences[i].split("/"); for (j=0; j<series.length; j++) { elements.push(series[j]); } var items = mapSeries(elements, function(element) { // do stuff with 'one', then 'two', then 'three' // when done..next series // do stuff with […]