Подтвердить что ты не робот

If-else поток в обещании (bluebird)

Это короткая версия моего кода.

var Promise = require('bluebird');
var fs = Promise.promisifyAll(require("fs"));

if (conditionA) {
  fs.writeFileAsync(file, jsonData).then(function() {
    return functionA();
  });
} else {
  functionA();
}

Оба условия вызывают functionA. Есть ли способ избежать другого? Я могу сделать fs.writeFileSync, но я ищу неблокирующее решение.

4b9b3361

Ответ 1

Я думаю, что вы ищете

(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();
});

Ответ 2

В то время как другие предложения здесь работают, лично я предпочитаю следующее.

Promise.resolve(function(){
  if (condition) return fs.writeFileAsync(file, jsonData);
}())
.then()

У него есть недостаток, заключающийся в том, чтобы всегда создавать это дополнительное обещание (скорее незначительное ИМО), но на мой взгляд выглядит намного чище. Вы также можете легко добавить другие условия/логику внутри IIFE.

ИЗМЕНИТЬ

После реализации таких вещей уже давно я определенно немного изменился. Первоначальное обещание создается независимо от того, что намного проще:

/* 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);
Initial state

Ответ 3

Вы всегда можете использовать 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
})

Или, если вы хотите, чтобы functionA вызывался только после того, как файл был написан, вы можете отделить:

maybeWrite(condition, file, jsonData)
.then(function(){
    // here file may have been written, you can call 'functionA'
    return functionA();
})