当前位置: 首页 > 知识库问答 >
问题:

如果-否则流在promise(蓝鸟)

宣星光
2023-03-14

这是我的代码的简短版本。

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,但我正在寻找一个非阻塞的解决方案。

共有3个答案

毋宏茂
2023-03-14

你总是可以使用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();
})
陆畅
2023-03-14

虽然这里的其他建议有效,但我个人更喜欢以下建议。

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
邴墨竹
2023-03-14

我想你是在找

(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最佳实践将事物放入块等。 试试下面的代码: