等待JavaScript

时间:2017-01-09 03:55:42

标签: javascript asynchronous promise

例如,假设我有这段代码:

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)之前已经有数据进入,甚至可以使用Promise,在这种情况下我也不想使用回调。是否有更简单或更快速的方法来做同样的事情?

3 个答案:

答案 0 :(得分:3)

使用Promise解决方案,使用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(''));
}

to"解释" cmdPromise,如果紧凑版本不可读,它基本上是这样的:

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

答案 1 :(得分:2)

这是一个涉及Promises的直接解决方案。

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 :(得分:0)

ES2017回答:通过async/await移除rows = [] rowa = [1,2,3] rows.append(rowa) rowb = [4,5,6] rows.append(rowb) ",".join([str(_) for _ in rows]) # Outputs [1, 2, 3],[4, 5, 6] 支持.then()(来自@ stephen-bugs-kamenar提及的评论。

=