2017-01-31 5 views
0

Скажем, у меня есть три асинхронное функции:Javascript гонки условие Promises

functionPromise1, functionPromise2, functionPromise3

Я хочу, чтобы все три, чтобы называться одновременно, со следующими данными:

  • Если functionPromise1 отвергается, остановка остальных двух функций от .
  • Если functionPromise2 и functionPromise3 оба финишируют и разрешены, перейдите к следующей части кода, но если functionPromise1 в конечном итоге отклонено, то не входите далее в код.
  • Если functionPromise2 или functionPromise3 отклонены, не переходите к следующей части кода.

Мой случай использования этих функций является то, что functionPromise1 служит в качестве входного подтверждения, что я хочу сделать синхронно с другими функциями, которые рассматривают ввод как уже подтверждено для того, чтобы ускорить мой процесс. Однако, если вход в какой-либо точке, признанный недействительным, functionPromise1, я хочу закончить код.

function functionPromise2(...){ 
    return new Promise(function(resolve,reject){ 
     fetchUrl(url, function(err, meta, body){ 
      if (err) { reject(err); } else { 
       if (body.toString().indexOf(text) !== -1){ 
        resolve(); 
       } else { 
        reject("Could not find quote"); 
       } 
      } 
     }); 
    }); 
} 

function functionPromise3(...) { 
    return new Promise(function(resolve,reject){ 
     var id = shortid.generate(); 
     var fileName = id+'.png'; 
     webshot(url, fileName, { shotOffset: {left: mouseX, top: mouseY} }, function(err) { 
      if (err) { reject(err); } else { 
       resolve({id: id, fileName: fileName}); 
      } 
     }); 
    }); 
} 
+0

Когда вы говорите «синхронно», вы, возможно, имеете в виду «параллельное»? потому что в противном случае вопрос имеет мало смысла. –

+0

@john_omalley Я имею в виду одновременный. Я предполагал, что они синонимы. Я изменю его сейчас. – db2791

+0

@mhodges. Разве это не означает, что они будут выполняться асинхронно? – db2791

ответ

2

Что касается «перейти к следующей части кода», вы по существу ищете Promise.all который ждет все и сразу отвергает, если есть ошибка в любом обещании:

return Promise.all([functionPromise1(), functionPromise2(), functionPromise3()]); 

Чтобы остановить последний два процесса, когда functionPromise1() отвергает, нет ничего, что может вам обещать, вам нужно сделать это вручную.

0

Ответ на этот вопрос действительно зависит от того, какая функцияPromise2 и функцияPromise3 делают. Если оба просто выполняют, скажем, одну операцию ввода-вывода, то вы просто хотите использовать Promise.all([f1, f2, f3]). Если они более активны (т. Е. Множественные обратные вызовы), вам нужно будет сохранить состояние где-то, чтобы удержать результат от первого обещания и проверить его на промежуточных этапах второго и третьего обещаний.

Вы не можете иметь настоящие условия гонки в однопоточном Javascript. В интересах простоты я убедился бы, что прямое решение - Promise.all или f1.then(() => Promise.all([f2, f3]) - было недостаточно хорошим, прежде чем сделать его более сложным.

Смежные вопросы