这是我的代码的简短版本。
var Promise = require('bluebird');
var fs = Promise.promisifyAll(require("fs"));
if (conditionA) {
fs.writeFileAsync(file, jsonData).then(function() {
return functionA();
});
} else {
functionA();
}
两个条件都调用函数A
。有没有办法避免其他情况?我可以做fs.writeFileSync
,但我正在寻找一个非阻塞的解决方案。
你总是可以使用Promise.all()
与条件函数
var condition = ...;
var maybeWrite = function(condition, file, jsonData){
return (condition) ? fs.writeFileAsync(file, jsonData) : Promise.resolve(true);
}
Promise.all([maybeWrite(condition, file, jsonData),functionA()])
.then(function(){
// here 'functionA' was called, 'writeFileAsync' was maybe called
})
或者,如果你想函数A
只在文件被写入后调用,你可以分开:
maybeWrite(condition, file, jsonData)
.then(function(){
// here file may have been written, you can call 'functionA'
return functionA();
})
虽然这里的其他建议有效,但我个人更喜欢以下建议。
Promise.resolve(function(){
if (condition) return fs.writeFileAsync(file, jsonData);
}())
.then()
它的缺点是总是创造这个额外的promise(在我看来,这个promise很小),但在我看来要干净得多。您还可以在iLife中轻松添加其他条件/逻辑。
编辑
在实施了很长一段时间之后,现在我已经明确地改变了一些更清晰的东西。不管怎样,最初的promise都会被创造出来,因此简单地做到以下几点更为清晰:
/* Example setup */
var someCondition = (Math.random()*2)|0;
var value = "Not from a promise";
var somePromise = new Promise((resolve) => setTimeout(() => resolve('Promise value'), 3000));
/* Example */
Promise.resolve()
.then(() => {
if (someCondition) return value;
return somePromise;
})
.then((result) => document.body.innerHTML = result);
html lang-html prettyprint-override">Initial state
我想你是在找
(conditionA
? fs.writeFileAsync(file, jsonData)
: Promise.resolve())
.then(functionA);
它是
var waitFor;
if (conditionA)
waitFor = fs.writeFileAsync(file, jsonData);
else
waitFor = Promise.resolve(undefined); // wait for nothing,
// create fulfilled promise
waitFor.then(function() {
return functionA();
});
问题内容: 使用Sql Server2012。我有一个存储过程,它的一部分检查用户名是否在表中。如果是,则返回1,否则返回2。这是我的代码: 但是,我一直收到以下错误: ‘1’附近的语法不正确。 使用IF EXIST甚至可以做到吗? 问候 问题答案: 如果您想这样做,那么这就是您要遵循的语法。 您不一定严格要求这些语句,但是最好是从一开始就养成这种习惯。
如果存在可选项,我想将值设置为字符串,否则根据条件从列表中获取它。我尝试了很多方法,但都无法获得它。我是Streams的新手,所以需要帮助。 基本上我的情况是传统的- 这是我写的,但它不起作用。我在orElse部分出错了- 你能建议一下正确的方法吗?提前感谢您的帮助。
问题内容: 我想知道是否可以选择列的值(如果该列存在),否则选择null。换句话说,当列不存在时,我想“举起” select语句来处理这种情况。 注意,我正在巩固我的数据模型和设计。我希望在接下来的几周中排除这种逻辑,但是我真的想超越这个问题,因为数据模型修复比我现在想解决的要耗费更多时间。 另请注意,我希望能够在一个查询中执行此操作。所以我不是在寻找像这样的答案 首先检查子查询中的列。然后修改您
问题内容: 在一个SQL语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。 我有: 该列具有唯一约束。我尝试在末尾追加,但这仍然不返回现有行。 为什么是这样?我以为我的最后一条语句将被执行并返回。有任何想法吗? 注意:由于某些复杂的竞争条件,我无法使用Postgres函数或多个SQL语句。 问题答案: WITH d(t, e) AS ( VALUES (‘abcdefg’, ‘2014-0
问题内容: 我在node.js中编写一个函数来查询PostgreSQL表。 如果该行存在,我想从该行返回id列。 如果不存在,我想将其插入并返回ID()。 我一直在尝试和语句的变体,但似乎无法使其正常工作。 问题答案: 我建议在数据库端进行检查,然后将ID返回给nodejs。 例子: 而不是在Node.js端(在此示例中,我使用的是node-postgres):
问题内容: 如果给定的文件名已经在数据库中,我想在表中进行更新,否则我想插入新行。我尝试此代码,但显示的错误请给我正确的方式,因为我在SQL中更新鲜 问题答案: 你应该 在查询中使用 参数 - 总是! - 没有例外 创建一个处理 服务器上零件的单个查询 __ 使用公认的ADO.NET最佳实践将事物放入块等。 试试下面的代码: