2017-01-09 3 views
1

Так, например, позволяет сказать, что у меня есть этот код:Ожидает две асинхронные команды в JavaScript

var cmd = require('node-cmd') 


function getStuff() { 

    return new Promise((resolve, reject) => { 

     var dataNStuff; 
     cmd.get('brew --version', data => { 
      dataNStuff += data; 
     }) 

     cmd.get('yarn global ls', data => { 
      dataNStuff += data; 
     }) 
     resolve(dataNStuff) 

    }) 
} 

В этом случае cmd.get() является асинхронной, так что я не знаю, когда данные поступают в Я хочу иметь возможность иметь оба звонка, которые уже имеют данные до I resolve(dataNStuff), это даже возможно с обещанием, и нет, я не хочу использовать обратный вызов в этом сценарии. Есть ли более простой или быстрый способ сделать то же самое?

+0

'Promise.all' является то, что вы хотите –

+0

объяснить @JaromandaX – adamSiwiec

+0

Я хочу, но мне интересно, если обещания обязательно лучший вариант –

ответ

3

Использование Promises для решения, использовать Promise.all и «promisified» версия cmd.get

var cmd = require('node-cmd'); 

var cmdPromise = arg => new Promise((resolve, reject) => cmd.get(arg, resolve)); 

function getStuff() { 
    return Promise.all([cmdPromise('brew --version'), cmdPromise('yarn global ls')]) 
    .then(results => results.join('')); 
} 

«объяснить» cmdPromise в том случае, компактная версия не читаемый, это в основном это:

var cmdPromise = function cmdPromise(arg) { 
    return new Promise((resolve, reject) => { 
    cmd.get(arg, data => resolve(data)); 
    }); 
}; 
2

Это простое решение, включающее обещания.

function getStuff() { 
    var dataNStuff = ''; 
    var promiseOne = new Promise(function(resolve, reject) { 
     cmd.get('brew --version', data => { 
      dataNStuff += data; 
      resolve(); 
     }); 
    });  
    var promiseTwo = new Promise(function(resolve, reject) { 
     cmd.get('yarn global ls', data => { 
      dataNStuff += data; 
      resolve(); 
     }); 
    }); 
    return Promise.all([promiseOne, promiseTwo]).then(function() { 
     return dataNStuff; 
    }); 
} 

Я предполагаю, что cmd.get будет выполняться один за другим. Если это предположение неверно, то нет гарантии порядка строк. (Т.е. он может отображать отвар перед той пряжей или он может отображать пряжу перед той варкой.)

+0

@JaromandaX Спасибо, я исправил его сейчас. Страшно подумать, что все было бы отлично. –

+0

, если вы «разрешаете (данные)», затем объединяете результаты в '.then' вы * можете * гарантировать порядок результатов в строке: p (см. Мой ответ) –

+0

Andrew, это действительно хорошее решение? Я бы не рекомендовал использовать переменные в прилагаемой области обещаний. Принятое решение выше - путь. Или я пропустил какой-то момент? – Stefan

0

ES2017 ответа:. Снятия .then() в пользу = через async/await (как комментарий от @ Стэфан-ошибка-Каменар упоминает

var log = console.log; 

var getBanana = function() { 
    return new Promise(function(resolve, reject) { 
     setTimeout(function(){ 
      resolve('banana') 
     }, 2000); 
    }); 
} 

var getGrape = function() { 
    return new Promise(function(resolve, reject) { 
     setTimeout(function(){ 
      resolve('grape') 
     }, 3000); 
    }); 
} 

var start = async function(){ 
    var result = await Promise.all([getBanana(), getGrape(), 'apple']) 
    console.log('All done', result) 
} 

start(); 
Смежные вопросы