可以承诺有多个参数onFulfilled?

我在这里遵循规范,我不确定是否允许onFulfilled被多个参数调用。 例如:

promise = new Promise(function(onFulfilled, onRejected){ onFulfilled('arg1', 'arg2'); }) 

这样我的代码:

 promise.then(function(arg1, arg2){ // .... }); 

会收到arg1arg2

我不在乎如何执行任何具体的承诺,我希望严格遵循w3c规范的承诺。

我在这里遵循规范,我不确定是否允许onFulfilled被多个参数调用。

不,只是第一个参数将被视为promise构造函数中的parsing值。 您可以使用像对象或数组一样的复合值来parsing。

我不在乎如何执行任何具体的承诺,我希望严格遵循w3c规范的承诺。

那就是我相信你错了的地方。 该规范被devise为最小的 ,并build立在承诺库之间的互操作。 这个想法是有一个子集,例如DOM未来可以可靠地使用和库消耗。 承诺实现做你现在所要​​求的.spread一段时间。 例如:

 Promise.try(function(){ return ["Hello","World","!"]; }).spread(function(a,b,c){ console.log(a,b+c); // "Hello World!"; }); 

与蓝鸟 。 一个解决scheme,如果你想要这个function是polyfill它。

 if (!Promise.prototype.spread) { Promise.prototype.spread = function (fn) { return this.then(function (args) { return Promise.all(args); // wait for all }).then(function(args){ //this is always undefined in A+ complaint, but just in case return fn.apply(this, args); }); }; } 

这可以让你做到:

 Promise.resolve(null).then(function(){ return ["Hello","World","!"]; }).spread(function(a,b,c){ console.log(a,b+c); }); 

本土承诺轻松小提琴 。

你可以使用E6解构:

对象解构:

 promise = new Promise(function(onFulfilled, onRejected){ onFulfilled({arg1: value1, arg2: value2}); }) promise.then(({arg1, arg2}) => { // .... }); 

数组解构:

 promise = new Promise(function(onFulfilled, onRejected){ onFulfilled([value1, value2]]); }) promise.then(([arg1, arg2]) => { // .... }); 

承诺的实现价值与函数的返回值相平行,承诺的拒绝原因与函数抛出的exception相平行。 函数不能返回多个值,所以承诺不得超过1个履行价值。

据我可以告诉阅读ES6承诺规范和标准承诺规范 theres没有任何条款阻止处理这种情况下的实施 – 但是它没有在下面的库中实现:

  • RSVP.promise(#L516-544)
  • Q诺(#787)

我假设他们忽略多重argparsing的原因是使更改顺序更简洁(即只能返回一个函数中的值,这样会使控制stream程更不直观)。示例:

 new Promise(function(resolve, reject) { return resolve(5, 4); }) .then(function(x,y) { console.log(y); return x; //we can only return 1 value here so the next then will only have 1 argument }) .then(function(x,y) { console.log(y); }); 

我正在寻找相同的解决scheme,并发现从这个答案非常intersting: 在AngularJS拒绝承诺与多个参数(如$ http)

这个弗洛里安家伙的答案

 promise = deferred.promise promise.success = (fn) -> promise.then (data) -> fn(data.payload, data.status, {additional: 42}) return promise promise.error = (fn) -> promise.then null, (err) -> fn(err) return promise return promise 

并使用它:

 service.get().success (arg1, arg2, arg3) -> # => arg1 is data.payload, arg2 is data.status, arg3 is the additional object service.get().error (err) -> # => err 

我有同样的问题,我通过在服务上添加一个头来解决这个问题

 @Provider public class CORSFilter implements ContainerResponseFilter { @Override public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext cres) throws IOException { cres.getHeaders().add("Access-Control-Allow-Origin", "*"); cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, Authorization, Authentication"); cres.getHeaders().add("Access-Control-Allow-Credentials", "true"); cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); cres.getHeaders().add("Access-Control-Max-Age", "1209600"); //I just add this header cres.getHeaders().add("access-control-expose-headers" , "Authorization"); } } 

为了引用下面的文章,“then”有两个参数,一个是成功案例的callback,另一个是失败案例,两者都是可选的,所以只能为成功或失败案例添加一个callback。

我通常看这个页面的任何基本承诺问题,让我知道如果我错了

http://www.html5rocks.com/en/tutorials/es6/promises/

由于JavaScript中的函数可以用任意数量的参数来调用,除了下面的子句,文档并没有对onFulfilled()方法的参数进行任何限制,我认为你可以将多个parameter passing给onFulfilled()方法因为诺言的价值是第一个论点。

 2.2.2.1 it must be called after promise is fulfilled, with promise's value as its first argument. 

很好的问题,本杰明,克里斯等人的很好的回答 – 非常感谢!

我在一个项目中使用它,并创build了一个基于Benjamin Gruenwald代码的模块。 它在npmjs上可用:

 npm i -S promise-spread 

然后在你的代码中,这样做

 require('promise-spread'); 

如果你正在使用诸如any-promise类的库

 var Promise = require('any-promise'); require('promise-spread')(Promise); 

也许其他人也觉得这有用!