例如,假设我有这段代码:
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,在这种情况下我也不想使用回调。是否有更简单或更快速的方法来做同样的事情?
答案 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提及的评论。
=