Javascript 此代码中嵌套承诺的用途是什么?

Javascript 此代码中嵌套承诺的用途是什么?,javascript,promise,bluebird,Javascript,Promise,Bluebird,我正在努力使自己熟悉承诺及其工作方式。虽然这对我来说是一个新概念,但我相对确信我能理解其中的大部分。特别是,我一直在研究这个库,并通过示例进行研究。然而,页面上有一个代码片段我不能完全理解 Promise.promisifyAll(needle); var options = {}; var current = Promise.resolve(); Promise.map(URLs, function(URL) { current = current.then(function ()

我正在努力使自己熟悉承诺及其工作方式。虽然这对我来说是一个新概念,但我相对确信我能理解其中的大部分。特别是,我一直在研究这个库,并通过示例进行研究。然而,页面上有一个代码片段我不能完全理解

Promise.promisifyAll(needle);
var options = {};

var current = Promise.resolve();
Promise.map(URLs, function(URL) {
    current = current.then(function () {
        return needle.getAsync(URL, options);
    });
    return current;
}).map(function(responseAndBody){
    return JSON.parse(responseAndBody[1]);
}).then(function (results) {
    return processAndSaveAllInDB(results);
}).then(function(){
    console.log('All Needle requests saved');
}).catch(function (e) {
    console.log(e);
});
在这段代码中,我了解到needle库正在被推广。我想我说的是正确的,电流被设定为一个空洞的承诺

我的问题是关于

current = current.then(function () {
    return needle.getAsync(URL, options);
});
return current;

代码。如果针已经被承诺,那么将它嵌套在另一个承诺中的目的是什么呢?

这是一种可疑的方式,它将异步调用排队,同时将它们交给map函数,从而生成一个包含所有结果的数组的承诺

那么它有什么作用呢?通常情况下,只有排队,带有电流累加器的循环也会这样做。它以空承诺开始,并重复地为数组中的每个url链接回调;类似于此代码:

var current = Promise.resolve().then(function() {
    return needle.getAsync(URL[0], options);
}).then(function() {
    return needle.getAsync(URL[1], options);
}).then(function() {
    return needle.getAsync(URL[2], options);
}) …
然而,在map循环中使用它实际上会生成一组单个承诺,如

var promises = [];
promises[0] = Promise.resolve().then(function() {
    return needle.getAsync(URL[0], options);
});
promises[1] = promises[0].then(function() {
    return needle.getAsync(URL[1], options);
});
promises[2] = promises[1].then(function() {
    return needle.getAsync(URL[2], options);
});
…
我要么使用reduce方法,从Promise.resolve[]开始,一步一步地添加到结果数组中,要么编写一个专用的扫描或mapAccum,无论您想将其命名为什么函数,并将其与Promise.all结合使用


或者更好,只要使用蓝鸟的内置

Bergi写了一个很好的答案,你应该读一下。下面是我如何使用以下各项编写代码:

请注意,您不需要捕获,因为蓝鸟会发现未处理的拒绝,并在本例中为您报告


通常,当人们执行上述代码时,他们关心的是顺序,尽管原始代码映射中没有保证顺序,但bluebird 2中的行为改变得更快,但不能保证排队顺序。

这是链接异步操作的可怕方式。它。这个地图和reduce的组合应该用它的名字:scan。我当然怀疑这是一个好代码。谢谢你把它清理干净。如果你想把这当作一个答案,我可以接受。嗯,其实没那么可怕。相当棘手和不明显:我认为它必须做这样的事情。非常感谢你把它清理干净!它的实现非常有趣。谢谢你的意见!这实际上是如何工作的?在每个文档中,我读取解析为未修改的原始数组,此方法用于产生副作用。所以get调用的结果不会传递给那些解析器函数?@Bergi oh woops,最好在bluebird 3中改变这一点。0@Bergi是的,它将在bluebird 3.0中更改。。很快我就要完成任务了website@Bergi简单地将返回值从无用更改为有用并不能保证有一个新的方法名,您可以像往常一样忽略返回值,它的功能将完全相同
var get = Promise.promisify(needle.get);

Promise.each(URLs, get). // make the requests
       map(function(x){ return JSON.parse(x[1])} ). // parse response as json
       then(processAndSaveAllInDB).
       then(function(){ console.log("All Needle requests saved"); }).