2016-09-05 17 views
1

我用下面的代码async.js使用诺系列,而不是异步系列

var arr = ['1', '2']; 
async.mapSeries(arr, getInfo, (e, res) => { 
    console.log(res); 
}); 

function getInfo(name, callback) { 
    setTimeout(() => { 
    callback(null, name + ' from async'); 
    }, 500); 
} 

现在我想将其转换为蓝鸟promise和我尝试以下方法却迟迟不工作,我觉得可能是我需要和Promise.delay但不知道如何使用它...

Promise.mapSeries(arr, function(getInfo) { 
    return getInfo + ' from promise' 
}).then(function(results) { 
    console.log(results) 
}); 
+0

'Promise.mapSeries'从哪里来? Async.js没有Promise类,因为它依赖于没有'mapSeries'的ES6 Promise。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise – martin

+2

http://bluebirdjs.com/docs/api/promise.mapseries.html – mplungjan

+1

要使用Bluebird的'Promise.mapSeries( )',你必须改变'getInfo()'返回一个承诺。 – jfriend00

回答

1

你似乎在寻找

function getInfo(name) { 
    return Promise.delay(500, name + ' from async'); 
} 
Promise.mapSeries(arr, getInfo).then(results => { 
    console.log(results) 
}); 

或者你可以写Promise.delay(500).then(() => name + ' from async')

1

首先,你必须promisify您的异步功能getInfo()如下:

function promisify(fun){ 
 
    return (data) => new Promise((resolve,reject) => fun(data, (err,res) => err ? reject(err) : resolve(res))); 
 
} 
 

 
function getInfo(name, callback) { 
 
    setTimeout(() => { 
 
    callback(null, name + ' from async'); 
 
    }, 500); 
 
} 
 

 
var getInfoPromise = promisify(getInfo); 
 

 
getInfoPromise("Mr. Promise").then(val => console.log(val))

+1

蓝鸟有它自己的promisification功能,最好使用它。 – Tomalak

+0

而不需要promisify'setTimeout'。只需使用'Promise.delay'! – Bergi

+0

@Bergi&@Tomalak谢谢您的好评。如果相同的功能嵌入到纯JS中,我不习惯使用库。我可能被认为是图书馆不可知论者。因此,在我的书中没有'Promise.delay()'或任何其他内容。对我而言,这是做这项工作的正确方式。 – Redu