我正在做的事情涉及按顺序运行child_process.spawn()
(进行一些设置,然后运行调用者感兴趣的实际命令),然后进行一些清理)。
就像是:
doAllTheThings()
.then(function(exitStatus){
// all the things were done
// and we've returned the exitStatus of
// a command in the middle of a chain
});
哪里doAllTheThings()
是这样的:
function doAllTheThings() {
runSetupCommand()
.then(function(){
return runInterestingCommand();
})
.then(function(exitStatus){
return runTearDownCommand(exitStatus); // pass exitStatus along to return to caller
});
}
在内部,我使用child_process.spawn()
,它返回,EventEmitter
并且有效地将close
事件的结果从runInterestingCommand()
返回给调用者。
现在,我还需要将data
事件从stdout和stderr发送到调用者,这些事件也来自EventEmitters。是否有一种方法可以使(Bluebird)Promises正常工作,或者它们只是妨碍发出多个事件的EventEmitters?
理想情况下,我希望能够写:
doAllTheThings()
.on('stdout', function(data){
// process a chunk of received stdout data
})
.on('stderr', function(data){
// process a chunk of received stderr data
})
.then(function(exitStatus){
// all the things were done
// and we've returned the exitStatus of
// a command in the middle of a chain
});
我认为可以使程序正常工作的唯一方法是将其重写以删除Promise链,而在包装设置/拆卸的内部使用原始的EventEmitter,例如:
withTemporaryState(function(done){
var cmd = runInterestingCommand();
cmd.on('stdout', function(data){
// process a chunk of received stdout data
});
cmd.on('stderr', function(data){
// process a chunk of received stderr data
});
cmd.on('close', function(exitStatus){
// process the exitStatus
done();
});
});
但是由于EventEmitters在Node.js中非常普遍,所以我不禁认为我应该能够使它们在Promise链中工作。有什么线索吗?
实际上,我想继续使用Bluebird的原因之一是因为我想使用Cancellation功能来允许从外部取消正在运行的命令。
有两种方法,一种提供您最初要求的语法,另一种采用委托。
function doAllTheThings(){
var com = runInterestingCommand();
var p = new Promise(function(resolve, reject){
com.on("close", resolve);
com.on("error", reject);
});
p.on = function(){ com.on.apply(com, arguments); return p; };
return p;
}
这将使您使用所需的语法:
doAllTheThings()
.on('stdout', function(data){
// process a chunk of received stdout data
})
.on('stderr', function(data){
// process a chunk of received stderr data
})
.then(function(exitStatus){
// all the things were done
// and we've returned the exitStatus of
// a command in the middle of a chain
});
但是,IMO这在某种程度上具有误导性,可能需要使代表通过:
function doAllTheThings(onData, onErr){
var com = runInterestingCommand();
var p = new Promise(function(resolve, reject){
com.on("close", resolve);
com.on("error", reject);
});
com.on("stdout", onData).on("strerr", onErr);
return p;
}
哪个可以让您做:
doAllTheThings(function(data){
// process a chunk of received stdout data
}, function(data){
// process a chunk of received stderr data
})
.then(function(exitStatus){
// all the things were done
// and we've returned the exitStatus of
// a command in the middle of a chain
});
问题内容: 我有一个名为PaymentStrategy的服务,已注入我的控制器中。 paymentStrategy中的这种购买方法会触发几种需要顺序调用的方法。当buy()中的所有方法都完成后,需要调用then()。 这可能是微不足道的,但我对棱角还很陌生。 目前,在init()方法之后立即触发buy()。then()。我觉得我们需要将所有这些方法放在一个promise中,并应用$ q.all()
问题内容: 我这样承诺 返回一个promise,yes 不能被修改 。 我如何在第一场比赛中脱颖而出?(除了显式抛出错误以外,还有其他方法吗?) 问题答案: 我想你不想在这里连锁。以同步的方式,您会写 这就是应如何将其转化为承诺: 诺言没有实现。
问题内容: 我需要创建链式承诺: 如果我将errorCallback放在第一个中,则第二个将被解析,并调用其successCallback。但是,如果我删除了,那么第二个承诺将被拒绝。 根据Angular JS的文档,传播拒绝的唯一方法是返回并且它看起来并不明显,尤其是因为即使不需要它,我也必须注入服务。 也可以通过在中引发异常来完成此操作,但是它将异常跟踪写入控制台,这不好。 还有另一种选择可以
问题内容: 我对诺言仍然还很陌生,目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,举例来说,我在Express应用程序中有一个Promise链,如下所示: 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸开并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果有其他问题,请
问题内容: 我对诺言仍然相当陌生,并且目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,例如,我在快速应用程序中有一个promise链,如下所示: 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸毁并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果还有其他问题,请返回50
问题内容: 在这里,我试图绕过Promise.Here在第一个请求时获取一组链接。在下一个请求时,我获取第一个链接的内容。但是我想在返回下一个Promise对象之前进行延迟。所以我使用setTimeout就可以了,但是它给了我下面的JSON错误( ) SyntaxError:JSON.parse:JSON数据的第1行第1列出现意外字符 我想知道为什么会失败? 问题答案: 为了保持承诺链的进行,您不