2015-10-18 46 views
0

在这里,我想要承诺一个一个解决。 Q.when似乎是一个很好的包装值。如果我已经有了一组Promise,除了使用.then(function(){return next();})之外,是否有一种紧凑的方式来执行此操作?任何紧凑的方式来承诺序列?

Here is my JSBin.及相关的JavaScript:

function wrap(v) { 
    var defer = Q.defer(); 
    window.setTimeout(function() { 
    console.log('okay, fine!'); 
    defer.resolve(v); 
    }, 3000); 
    return defer.promise; 
} 
/* 
wrap(1) 
    .then(function() { 
    return wrap(3); 
    }) 
    .then(function(v) { 
    console.log(v); 
    }); 
*/ 

/* map result is an array of promise 
when using reduce, it will resolve one by one. 
*/ 

[1, 3, 4, 5].map(wrap) 
    .reduce(Q.when, Q(undefined)) 
    .then(function(v) { 
    console.log(done); 
    }); 
+1

如果你已经有了承诺的阵列有*不*您可以等待除外('Q.all')做的。 – Bergi

+0

您是否需要支持一系列动态大小或者您有预定义的数组? –

+1

与您的问题相关的代码必须粘贴到问题中,而不仅仅在外部链接中提供。这是一个堆栈溢出策略。 – jfriend00

回答

0

我发现这个Q中的GitHub库。看来在reduce函数中我们仍然可以使用.then

Q.when是不应该使用承诺。

function wrap(v) { 
 
    var defer = Q.defer(); 
 
    window.setTimeout(function() { 
 
    document.body.innerHTML += ('okay, fine! here is ' + v + '<br/>'); 
 
    defer.resolve(v); 
 
    }, 3000); 
 
    return defer.promise; 
 
} 
 

 
[1, 3, 4, 5] 
 
.reduce(function(soFar, f) { 
 
    return soFar 
 
    .then(function(v) { 
 
     return wrap(f); 
 
    }); 
 
}, Q(undefined));
<script src="https://cdnjs.cloudflare.com/ajax/libs/q.js/1.0.1/q.js"></script>

+1

你不想'换行(soFar)',你只是想'返回soFar.then(...)' – Bergi

+0

是的。你太棒了。谢谢! http://jsbin.com/fataco/8/edit?html,js,console,output – Peng