Так, например, скажем, у меня есть этот код:

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 () является асинхронным, поэтому я не знаю, когда поступают данные. Я хочу, чтобы оба вызова уже имели данные, поступающие до того, как я resolve(dataNStuff), это даже возможно с обещанием, и нет, я не хочу использовать обратный вызов в этом сценарии. Есть ли гораздо более простой или быстрый способ сделать то же самое?

1
adamSiwiec 9 Янв 2017 в 06:55

3 ответа

Лучший ответ

Используя Promises для решения, используйте Promise.all и «обещанную» версию 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));
  });
};
3
Jaromanda X 9 Янв 2017 в 04:10

Ответ ES2017 : удалить .then() в пользу = через async / await (как упоминается в комментарии из @ stephen-bugs-kamenar.

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();
0
mikemaccana 19 Июн 2017 в 15:30

Вот простое решение с участием Обещаний.

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 будет выполняться один за другим. Если это предположение неверно, то нет гарантии порядка строк. (т.е. он может отображать варку перед пряжей или может отображать пряжу перед варкой.)

2
Andrew Shepherd 10 Янв 2017 в 21:53